我试图将我现有的插入方法转换为查询范围,以便我可以重用它们并采用更干的方法.
这就是我想要转换为Larvel查询范围的内容:
$time = new Time;
$time->employee_id = $input['user_id'];
$time->day = Carbon::now()->toDateString();
$time->clock_in = Carbon::now()->toTimeString();
$time->save();
这就是我现在对查询范围的看法:
public function scopeClockIn($query, $userID) {
$query->employee_id = $userID;
$query->day = Carbon::now()->toDateString();
$query->clock_in = Carbon::now()->toTimeString();
$query->save();
}
这就是我调用上面的查询范围的方法:
$time = Time::clockIn($input['user_id']);
但我得到错误:
Call to undefined method Illuminate\Database\Query\Builder::save()
我也尝试过:
$time = new Time::clockIn($input['user_id']);
但是当我尝试使用new关键字时出现错误:
语法错误,意外的’clockIn'(T_STRING),期望变量(T_VARIABLE)或’$’
谷歌一直没有帮助我发现其他问题与相同的错误消息,但他们试图检索结果而不是插入它们.希望有人在这里可以帮我弄清楚我做错了什么.
解决方法:
好的,写得很好的问题.
Laravel使用Builder通过例如数据库与数据库进行交互.构造和执行SQL查询.一旦完成,它将返回您的Time对象 – 或者它们的集合.
当你这样做时Time :: all()或Time :: where(‘something’,’=’,’something’) – > get(),你没有使用Time对象而是使用Builder.
范围在“从数据库获取和返回内容”阶段应用,这就是您从Builder收到错误的原因.你无法保存任何东西 – 因为你仍在构建一个查询,你实际上并不是一个Time对象的实例.
你的想法很好,把事情变得更小,更清晰通常是一个好主意.它不应该是一个范围.你想要做的可能是只提供用户ID并使其成为静态函数.像这样的东西:
public static function createFromUserId($userID) {
$time = new static();
$time->employee_id = $userID;
$time->day = Carbon::now()->toDateString();
$time->clock_in = Carbon::now()->toTimeString();
$time->save();
return $time;
}
请注意static关键字,这意味着您没有使用特定对象,而是使用类上的常规函数.这就是为什么你在后面的问题中得到了语法错误::: in Time :: clockIn()表示它是一个静态方法,但你还没有使方法成为静态.
我还确保该方法返回创建的时间,以防您需要对其进行操作.现在,您可以使用用户ID创建新的Time对象,如下所示:
$time = Time::createFromUserId($userID);
我希望能回答你的问题.
标签:php,laravel,laravel-5
来源: https://codeday.me/bug/20190608/1201245.html