我正在尝试将我现有的插入方法转换为查询范围,以便我可以重用它们并采用更 DRY 的方法。
这是我想转换为 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
关键字时,出现错误:syntax error, unexpected 'clockIn' (T_STRING), expecting variable (T_VARIABLE) or '$'
谷歌并没有很有帮助我发现其他问题具有相同的错误消息,但他们试图检索结果而不是插入它们。希望这里有人可以帮助我弄清楚我做错了什么。
最佳答案
很好,写得很好的问题。
Laravel 使用 Builder 与数据库交互,例如构造和执行 SQL 查询。完成后,它会返回您的 时间 对象 - 或其中的 集合 。
当你做例如Time::all()
或 Time::where('something', '=', 'something')->get()
,您使用的不是 时间 对象,而是 Builder 。
在“从数据库中获取和返回内容”阶段应用范围,这就是您从 Builder 收到错误的原因。您无法保存任何内容 - 因为您仍在构建查询,您实际上并未处于 时间 对象的实例中。
你的想法很好,把事情做得更小更清晰通常是个好主意。它不应该是一个范围。您想要做的可能是仅提供用户 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
关键字,这意味着您使用的不是特定对象,而是类上的通用函数。这就是为什么您稍后会在问题中遇到语法错误的原因:::
中的 Time::clockIn()
表示它是一个静态方法,但您没有将该方法设为静态。我还确保该方法返回创建的时间,以防您需要对其进行处理。现在,您可以像这样从用户 ID 创建新的 时间 对象:
$time = Time::createFromUserId($userID);
我希望这能回答你的问题。
关于php - Laravel save() 未定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35676473/