【发布时间】: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_name 和 last_name 对应于 from_user_id 。但我也想要对应于to_user_id 的first_name 和last_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