使用join in laravel在集合中查找

使用join in laravel在集合中查找,laravel,laravel-5,Laravel,Laravel 5,如何使用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 SYMPHON

如何使用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('')));
});

我不知道您目前面临的确切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();
exists方法确保每个用户在结果集中只出现一次。

试试这个

$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
                )

        )

)

很好,假设我们想连接两列book_name和book_author,然后\DB::raw(“GROUP_CONCAT(book.book_name)as book_name”))如何连接book_author?book_author表在哪里?我没有看到任何有问题的地方?只是更新了问题,只是想把作者的名字也浓缩起来
\DB::raw(“GROUP_CONCAT(CONCAT(book.book_name,“-”,book.book_author)SEPARATOR“,”)作为书的作者”)
试试看,我希望这本书是关于Symfony的,而不是关于Symphony的?)