Laravel save()未定义

Yam*_*088 4 php laravel laravel-5

我试图将我现有的插入方法转换为查询范围,以便我可以重用它们并采用更干的方法.

这就是我想要转换为Larvel查询范围的内容:

$time = new Time;
$time->employee_id  = $input['user_id'];
$time->day          = Carbon::now()->toDateString();
$time->clock_in     = Carbon::now()->toTimeString();
$time->save();
Run Code Online (Sandbox Code Playgroud)

这就是我现在对查询范围的看法:

public function scopeClockIn($query, $userID) {
    $query->employee_id  = $userID;
    $query->day          = Carbon::now()->toDateString();
    $query->clock_in     = Carbon::now()->toTimeString();
    $query->save();
}
Run Code Online (Sandbox Code Playgroud)

这就是我调用上面的查询范围的方法:

$time = Time::clockIn($input['user_id']);
Run Code Online (Sandbox Code Playgroud)

但我得到错误:

Call to undefined method Illuminate\Database\Query\Builder::save()
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

$time = new Time::clockIn($input['user_id']);
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用new关键字时出现错误:

syntax error, unexpected 'clockIn' (T_STRING), expecting variable (T_VARIABLE) or '$'

谷歌一直没有帮助我发现其他问题与相同的错误消息,但他们试图检索结果而不是插入它们.希望有人在这里可以帮我弄清楚我做错了什么.

Joe*_*inz 5

好的,写得很好的问题.

Laravel使用Builder通过构建和执行SQL查询来与数据库进行交互.一旦完成,它将返回您的Time对象 - 或者它们的集合.

当你做eg 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;
}
Run Code Online (Sandbox Code Playgroud)

注意static关键字,这意味着您没有使用特定对象,而是使用类上的常规函数​​.这就是为什么你在后面的问题中得到语法错误的原因:::in Time::clockIn()信号表明它是一个静态方法,但是你还没有使方法成为静态的.

我还确保该方法返回创建的时间,以防您需要对其进行操作.现在,您可以使用用户ID 创建新的Time对象,如下所示:

$time = Time::createFromUserId($userID);
Run Code Online (Sandbox Code Playgroud)

我希望能回答你的问题.