【问题标题】:Nested Join with Laravel 4.0Laravel 4.0 的嵌套连接
【发布时间】:2013-09-27 11:31:15
【问题描述】:

我正在努力使用 Laravel Query Builder 构建以下嵌套的复杂查询。我正在使用 laravel 4.0。嵌套连接的主要问题。

SELECT clubs.id, clubs.slug, clubs.name as `club_name`, clubs.state, clubs.category, clubs.live, `m`.`total_members`, `m`.`online_members`, `m`.`offline_members`, `m`.`last_7days_members` as `total_members_last_7days`

            FROM clubs

            LEFT JOIN 
                (
                    SELECT id, club_id, count(*) as `total_members`, SUM(online_member = 1) AS online_member 

                    FROM members 

                    LEFT JOIN

                        (
                            SELECT posts.id, posts.member_id, posts.title, posts.body 
                            FROM posts 
                            WHERE posts.transaction_id IS NOT NULL

                        ) p on p.member_id = members.id
                    WHERE (`post_verfied` is null or `post_verfied` = 1) 
                        AND `members`.`deleted_at` is null
                    group by club_id
                ) m on m.club_id = clubs.id

            LEFT JOIN comments on comments.member_id = m.id

            WHERE clubs.`deleted_at` is null
            group by `clubs`.name

请帮忙..

【问题讨论】:

    标签: sql laravel laravel-4


    【解决方案1】:

    您可以使用DB:raw 进行如下处理:

    DB:table('table1')->leftJoin(DB::raw('(select * 
                                 from table2 
                                 join table3 on table3.id = table2.id) as mytable'),
    function($join)
    {
        $join->on('table1.id', '=', 'mytable.id');
    });
    

    我知道这不是您真正想要的,但它是部分解决方案。调查我发现 Laravel 4.x 不支持。一年前在 Laravel 3.x 中有一个 pull ,但最终没有实现。无论如何,您都可以在Builder.php 中看到您可以使用查询生成器应用的所有选项。

    当您无法使用 Query Builder 或 Eloquent ORM 执行复杂查询时,您也可以使用 DB:statement

    【讨论】:

    • 感谢您的回答。实际上我正在寻找嵌套连接的解决方案。
    • 其实在当前版本的 Laravel 中并没有实现。这真的引起了我的注意,我希望在未来的版本中实现这种连接。无论如何,记住框架不是万能的,有很多限制,实际上嵌套连接就是其中之一。对于复杂的查询,我建议您使用DB::statement
    • 我正在使用 DB:SELECT()。 DB::statement 和 DB::Select 有什么区别?
    • 使用DB::statement,您可以运行任何类型的查询(选择、更新、删除等)。对于您在问题中指定的查询,您可以使用DB::select,因为您想要检索数据。
    猜你喜欢
    • 2013-01-18
    • 2021-07-10
    • 1970-01-01
    • 2017-05-31
    • 2013-11-28
    • 2019-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    相关资源
    最近更新 更多