Laravel Query Builder отобрать настоящий raw sql - PullRequest
0 голосов
/ 30 ноября 2018

Hello StackOverflow Community,

Я изо всех сил пытаюсь использовать настоящий raw sql в подвыборке из построителя запросов laravel.

Я не знаю ни одной функции, которая позволит мне передавать реальныеraw sql как подзапрос без вмешательства laravel в sql, который я пишу.

Поскольку я имею дело со структурой, у меня нет возможности использовать Laravel Query Builder.

Я хочу использовать MysqlОконные функции (http://www.mysqltutorial.org/mysql-window-functions/) в моем подзапросе.

Если я использую функцию Querybuilder ->raw(), она выдаст только select * в качестве запроса. Если я использую функцию построителя запросов ->selectRaw, то она будет добавленавыборочный элемент моего пользовательского подзапроса.

И то, и другое - не то, что мне нужно, мне нужен REAL RAW SQL в качестве подзапроса.

Вот как это выглядит сейчас:

public static function hasConsentsQuery($query, $consentIds) {
    $joinId = 'consent_user'.'_'.StringHelper::getRandomChars();

    $query->join("consent_user as $joinId", "$joinId.user_id", '=', 'users.id');
    $query->whereIn("$joinId.consent_id", $consentIds);
    $query->where("$joinId.is_accepted", 1);
    $query->whereIn("$joinId.id", function($query) {
        $query->selectRaw("WITH ranked_messages AS (SELECT m.*, ROW_NUMBER() OVER (PARTITION BY user_id,consent_id ORDER BY created_at DESC) AS rn FROM consent_user AS m ) SELECT * FROM ranked_messages WHERE rn = 1");
    });

    $query->havingRaw("COUNT(DISTINCT $joinId.consent_id) = " . count($consentIds));
}

Как я могу использовать RAW SQL в качестве подзапроса для Laravel Query Builder или оконных функций с Laravel в целом?

С уважением, Берлин

...