Это для 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.