Есть ли способ сопоставить необработанный запрос с моделью

У меня есть сложный необработанный 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), потому что мне не нужны инъекции.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
5
0
2 553
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете использовать любой из следующих методов

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-инъекций.

Хорошо спасибо. Я знаю об этих методах. Мой вопрос: могу ли я сопоставить необработанный запрос модели.

rap-2-h 04.04.2018 11:36

Я думаю, если вам нужно сопоставить запрос с моделью, вам нужно использовать красноречивый

afsal c 04.04.2018 11:41

может использовать необработанные методы запроса красноречиво, например, Model :: select (DB :: raw ('query')) -> get ();

afsal c 04.04.2018 11:44

Это не отвечает на вопрос OP.

S. Saad 26.09.2019 22:21

Использовать PDO

$sth = $dbh->query("SELECT * FROM user");
$result = $sth->fetchAll(PDO::FETCH_CLASS, "User");

Спасибо! +1. Тем не менее я нашел этот метод: stackoverflow.com/a/49647751/978690, который кажется более Laravel-esque (или Laravel-ish)

rap-2-h 04.04.2018 11:52

Это действительно больше похоже на Laravel! Я использую doctrine-dbal, но обычно использую PDO, когда фреймворк слишком усложняет ситуацию. Он всегда должен быть читабельным :-)

Gudgip 04.04.2018 11:58

Вы можете использовать метод 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

rap-2-h 04.04.2018 13:40

Другие вопросы по теме