2016-02-27 5 views
4

Я пытаюсь преобразовать существующие методы вставки в области запросов, чтобы я мог их повторно использовать и иметь более СУХОЙ подход.Laravel save() не определено

Это то, что я хочу, чтобы преобразовать в рамки запроса 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 '$'

Google не очень полезно, я нашел другой вопросы с тем же сообщением об ошибке, но они пытаются получить результаты, не вставляя их. Надеюсь, кто-то здесь поможет мне понять, что я сделал неправильно.

ответ

5

Хорошо и хорошо написанный вопрос.

Laravel использует Builder для взаимодействия с базой данных, например. построение и выполнение SQL-запросов. Как только это будет сделано, он вернет ваш объект - или Коллекция из них.

Когда вы это сделаете, например. Time::all() или Time::where('something', '=', 'something')->get(), вы не используете Время объект, а скорее Builder.

Сфера применения применяется во время фазы получения и возврата из базы данных, поэтому вы получаете сообщение об ошибке Builder. Вы ничего не можете сохранить - поскольку вы все еще строите запрос, вы фактически не являетесь экземпляром объекта Time.


Ваше мышление хорошее, обычно это хорошая идея сделать вещи более компактными и более отчетливыми. Это просто не должно быть масштабом. То, что вы хотите сделать, вероятно, должно предоставить только идентификатор пользователя и сделать его статической функцией. Что-то вроде этого:

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() сигнализирует, что это статический метод, но вы не сделали метод статическим.

Я также убедился, что метод возвращает созданное время, если вам нужно что-то сделать с ним.Теперь вы можете создать новый времени объектов пользовательского идентификатора просто, как это:

$time = Time::createFromUserId($userID); 

Я надеюсь, что ответ на ваш вопрос.

+0

Удивительное спасибо за подробное объяснение! – Yamaha32088

+0

Рад, что это помогло. :) –