Использование метода модели Laravel в запросе Eloquent

Это для Laravel 5.2. У меня есть метод, определенный в моей модели «Пользователи»:

public function name() { return "$this->name_first $this->name_last"; } 

Я пытаюсь понять, как использовать это как часть запроса, но похоже, что это невозможно по несколько очевидной причине: база данных ничего не знает об этом методе и имеет смысл. Однако концепция того, что я пытаюсь достичь, имеет смысл в определенных контекстах, поэтому я пытаюсь понять, есть ли способ сделать это, естественно, в Eloquent.

Это не работает, но это то, что я пытаюсь выполнить:

 public function index(Request $request) { $query = new User(); if(Request::has('name')) { $query = $query->where('name', 'LIKE', '%' . Request::input('name') . '%'); } return $query->get(); } 

Короче говоря, база данных знает только о name_first и name_last , но я хотел бы иметь возможность искать (и сортировать) по name не сохраняя его. Возможно, хранение конкатенированного имени не имеет большого значения, и я должен просто сделать это, но я также пытаюсь учиться.

Я согласен с Богданом. Проблема наличия пробелов либо в первом, либо в последнем случае затрудняет запрос к отдельным столбцам, поэтому, вероятно, это путь. Повторное использование кода может быть увеличено путем определения его как настраиваемой области: https://laravel.com/docs/5.2/eloquent#local-scopes

 // class User public function scopeOfFullNameLike($query, $fullName) { return $query->whereRaw('CONCAT(name_first, " ", name_last) LIKE "%?%"', [$fullName]); } // ... User::ofFullNameLike('john doe')->get(); 

Это означает, что вы должны конкатенировать значение столбца на уровне базы данных. Это означает, что вы можете использовать CONCAT и предложение whereRaw :

 $query->whereRaw('CONCAT(name_first, " ", name_last) LIKE ?', ['%' . Request::input('name') . '%']); 

Или в качестве альтернативы, если вы хотите, чтобы полное имя было выбрано как часть результата, вы могли бы объединиться в выборе и использовании having вместо того, чтобы иметь возможность использовать псевдоним столбца:

 $query->select('*', DB::raw('CONCAT(name_first, " ", name_last) as name')) ->having('name', 'LIKE', '%' . Request::input('name') . '%'); 

Не самые компактные решения, но для работы с функциями MySQL требуется некоторый необработанный SQL для работы с Query Builder.