【问题标题】:advance join in laravel 5提前加入laravel 5
【发布时间】:2015-11-12 11:23:36
【问题描述】:

我有一个像这样的user

+----+------------+-----------+---------+
| id | first_name | last_name | address |
+----+------------+-----------+---------+
| 1  |     x      |     y     |    z    |
| 2  |     a      |     b     |    c    |
| 3  |     p      |     q     |    r    |
+----+------------+-----------+---------+

还有一个像这样的transfer

+----+--------------+------------+--------+
| id | from_user_id | to_user_id | amount |
+----+--------------+------------+--------+
| 1  |      1       |     2      |   20   |
| 2  |      2       |     1      |   10   |
| 3  |      3       |     2      |   10   |
+----+--------------+------------+--------+

现在我可以像这样使用连接查询

 $transfer = DB::table('users')
            ->join('transfers', function($join) {
                $join->on('users.id', '=', 'transfers.from_user_id');
            })
            ->select('users.first_name','users.last_name', 'transfers.amount', 'transfers.date')
            ->get();

但是这样做只会给我 first_namelast_name 对应于 from_user_id 。但我也想要对应于to_user_idfirst_namelast_name。我怎样才能得到它们?

我想要的输出表

+---------+---------+--------+
| sent_by | sent_to | amount |
+---------+---------+--------+
|   xy    |   ab    |   20   |
|   ab    |   xy    |   10   |
|   pq    |   ab    |   10   |
+---------+---------+--------+

这是生成上表所需的 MySQL 查询。如您所见,它需要 2 个内部连接:

SELECT CONCAT(u1.first_name, u1.last_name), CONCAT(u2.first_name, u2.last_name), t.amount
FROM transfer t INNER JOIN user u1
ON t.from_user_id = u1.id
INNER JOIN user u2
ON t.to_user_id = u2.id

【问题讨论】:

  • 您应该向我们展示所需的输出表。
  • @TimBiegeleisen 查看更新后的问题
  • 解决此问题的最简单方法是在 MySQL 中创建一个视图,然后创建一个 Laravel 只读模型,该模型仅从该视图中读取。这样你就可以避免关于查询构建器的所有恶作剧,你的代码会更简单(更小)并且查询视图比你加入表要快一些。

标签: mysql laravel-5 query-builder


【解决方案1】:

这是我为您的 Laravel 查询提供解决方案的尝试:

$transfer = DB::table('transfer')
                     ->join('user as u1', 'transfer.from_user_id', '=', 'u1.id')
                     ->join('user as u2', 'transfer.to_user_id', '=', 'u2.id')
                     ->select(DB::raw('CONCAT(u1.first_name, u1.last_name) AS sent_by'), 
                              DB::raw('CONCAT(u2.first_name, u2.last_name) AS sent_to'),
                              'transfer.amount as amount')
                     ->get();

诀窍是知道如何包含从transferuser 表的双重联接的别名,以及使用DB::raw() 访问MySQL 的CONCAT 函数。

【讨论】:

    【解决方案2】:

    在您的连接表上使用别名。 希望对您有所帮助。

    $transfer = DB::table('transfers')
        ->join('users as senders', function($join) {
            $join->on('transfers.from_user_id', '=', 'senders.id');
        })
        ->join('users as receivers', function($join) {
            $join->on('transfers.to_user_id', '=', 'receivers.id');
        })
        ->select('senders.first_name','senders.last_name', 'receivers.first_name','receivers.last_name', 'transfers.amount', 'transfers.date')
        ->get();
    

    【讨论】:

    • 好吧,这没有帮助。我认为你没有理解我的问题
    • 我知道您想使用查询生成器从单个查询中获取有关传输的发送者和接收者的信息,不是吗? // 编辑:对不起,你是对的,我理解得很好,但提供了一个错误的查询,我现在更正它;)
    猜你喜欢
    • 2017-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 1970-01-01
    • 2017-05-07
    • 2018-12-08
    • 1970-01-01
    • 2016-01-20
    相关资源
    最近更新 更多