可观察的更新值

时间:2018-04-05 17:08:20

标签: php mysql laravel eloquent observable

我的问题很简单 我希望每次用户选择一个包时,valid_until列会根据所选的包递增; 为了解决这个问题,我创建了一个

SELECT SUM(CASE WHEN Side = 'A' THEN Bad ELSE 0 END) AS bad_A, 
       SUM(CASE WHEN Side = 'B' THEN Bad ELSE 0 END) AS bad_B, 
       CAST(t_stamp as DATE) AS Time
FROM Log l
WHERE t_stamp BETWEEN '2018-03-01 06:00:00' AND '2018-04-06 06:00:00'
GROUP BY CAST(t_stamp as DATE);
ORDER BY MIN(t_stamp);

问题是我不知道如何获得package.name。 包和许可之间的关系如下:

  1. 包(ID,名称entry_nr,USER_ID,价格,flga_six_days)
  2. 许可证(ID,USER_ID,membership_id,used_entries,valid_until,条目flag_six_days) 在此先感谢!感谢您的帮助! 抛出:
  3.   

    BadMethodCallException方法addMonths不存在。

1 个答案:

答案 0 :(得分:2)

假设您在ServiceProvider中有类似以下内容

public function boot()
{
    Package::observe(PackageObservable::class);
}

应该将包模型传递给Observable类,以便获得包名称,您应该只需要$package->name。如果这是null,那么当您创建包时,您没有定义名称。

以下所有命令都尝试运行select语句;

DB::table('permit')
        ->select('permit.valid_until')
        ->join('package', 'user_id', '=', 'package.user_id')
        ->where('package.name','=',$package->name)
         ->addMonths(12);

查询构建器上不存在方法addMonths。您的许可证模型上有addMonths()方法吗?

你可能想要按照

的方式做点什么
 $permit = Permit::select("valid_until")->where('user_id',$package->user_id)->orderBy('user_id', 'desc')->first(); 

 if ($permit) {
     $newValidUntil = $permit->valid_until->addMonths(12);
     $permit->update(['valid_until' => $newValidUntil]);
 }

如果您发表评论让我知道您是如何继续的,我可以随时更新我的​​答案以适应您需要的任何额外信息。