У меня есть сложный необработанный SQL-запрос, который я не хочу преобразовывать в конструктор запросов. Есть ли способ сопоставить результат запроса с моделью?
Короче говоря, у меня такой запрос:
SELECT users.* FROM users
WHERE exists (super_long_raw_query)
AND many_more_raw_where_clauses
ORDER BY something_complex
etc;
Он возвращает только столбцы из одной модели (из таблицы, соответствующей модели).
Было бы ужасно и не читается преобразовать его в запрос "Laravel Query Builder":
User::where(/* ... */)
->whereExists(function() { /* super complex callback */ } )
->etc(/* ... */)
Необработанный запрос (в данном конкретном случае) читать легче.
Есть ли способ сопоставить необработанный запрос модели? (при условии, что он возвращает только столбцы определенной модели)
Боковое примечание: это необработанный запрос, который использует параметры запроса (?, :something), потому что мне не нужны инъекции.






Вы можете использовать любой из следующих методов
DB::select('your raw query here');
и вы можете использовать необработанные выражения, такие как
DB::raw('your raw query here');
и такие методы, как
->selectRaw(''),
->whereRaw(''),
->havingRaw('')
Подробности смотрите в документации https://laravel.com/docs/5.6/queries#raw-expressions
Необработанные операторы будут вводиться в запрос в виде строк, поэтому следует быть предельно осторожным, чтобы не создать уязвимости SQL-инъекций.
Я думаю, если вам нужно сопоставить запрос с моделью, вам нужно использовать красноречивый
может использовать необработанные методы запроса красноречиво, например, Model :: select (DB :: raw ('query')) -> get ();
Это не отвечает на вопрос OP.
Использовать PDO
$sth = $dbh->query("SELECT * FROM user");
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");
Спасибо! +1. Тем не менее я нашел этот метод: stackoverflow.com/a/49647751/978690, который кажется более Laravel-esque (или Laravel-ish)
Это действительно больше похоже на Laravel! Я использую doctrine-dbal, но обычно использую PDO, когда фреймворк слишком усложняет ситуацию. Он всегда должен быть читабельным :-)
Вы можете использовать метод hydrate:
$users = User::hydrate(
DB::select('super_complex_query_with_params', [$params])
);
См .: https://laravel.com/api/5.6/Illuminate/Database/Eloquent/Builder.html#method_hydrate
Используйте fromQuery()
$query = \Illuminate\Support\Facades\DB::raw('select * from users');
$users = \App\User::fromQuery($query, []);
Спасибо! +1. Я не знал о fromQuery, который является сокращением для моего ответа: stackoverflow.com/a/49647751/978690
Хорошо спасибо. Я знаю об этих методах. Мой вопрос: могу ли я сопоставить необработанный запрос модели.