find_in_set с объединением в laravel - PullRequest
2 голосов
/ 11 октября 2019

Как получить вывод желаний с помощью запроса laravel. Попробовал, чтобы этот путь не увенчался успехом, пожалуйста, спасибо большое заранее

Есть ли способ установить его в модели, если это возможно, пожалуйста, руководство

User

id  name    b_id
1   Alax    1,3
2   Rex     2,4
3   Lex     2,3

Books

id  book_name   book_author
1   Javascript  jim
2   PHP         json
3   LARAVEL     rax
4   SYMPHONY    Alax

Output

id  name    b_id
1   Alax    Javascript, LARAVEL
2   Rex PHP, SYMPHONY
3   Lex PHP, LARAVEL

И запрос:

$res = DB::table('user')->leftJoin('book', function($join){
   $join->on(DB::raw("find_in_set(book.id, user.b_id)",DB::raw(''),DB::raw('')));
});

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Попробуйте это.

$data = \DB::table("user")
        ->select("user.*",\DB::raw("GROUP_CONCAT(book.book_name) as book_name"))
        ->leftjoin("book",\DB::raw("FIND_IN_SET(book.id,user.b_id)"),">",\DB::raw("'0'"))
        ->get();


\DB::raw("GROUP_CONCAT(CONCAT(book.book_name, ' - ', book.book_author) SEPARATOR ', ') AS book_name_author")

Ваш вывод выглядит как.

Illuminate\Support\Collection Object

(

    [items:protected] => Array

        (

            [0] => stdClass Object
                (
                    [id] => 1
                    [name] => Alax
                    [b_id] => 1,3
                    [book_name] => Javascript,LARAVEL
                )

            [1] => stdClass Object
                (
                    [id] => 2
                    [name] => Rex
                    [b_id] => 2,4
                    [book_name] => PHP,SYMPHONY
                )
            [2] => stdClass Object
                (
                    [id] => 3
                    [name] => Lex
                    [b_id] => 2,3
                    [book_name] => PHP,LARAVEL
                )

        )

)
0 голосов
/ 11 октября 2019

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

SELECT u.id, u.name
FROM User u
WHERE EXISTS (SELECT 1 FROM Books b WHERE FIND_IN_SET(b.id, u.b_id) > 0);

Код Laravel:

$res = DB::table('user u')
    ->whereExists(function ($query) {
        $query->select(DB::raw(1))
              ->from('book b')
              ->whereRaw('FIND_IN_SET(b.id, u.b_id) > 0');
        })
    ->get();

Существующий подход гарантирует, что каждый пользователь будет толькопоявляются один раз в наборе результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...