Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 提前加入laravel 5_Mysql_Laravel 5_Query Builder - Fatal编程技术网

Mysql 提前加入laravel 5

Mysql 提前加入laravel 5,mysql,laravel-5,query-builder,Mysql,Laravel 5,Query Builder,我有一个这样的用户表 +----+------------+-----------+---------+ | id | first_name | last_name | address | +----+------------+-----------+---------+ | 1 | x | y | z | | 2 | a | b | c | | 3 | p | q

我有一个这样的用户表

+----+------------+-----------+---------+
| id | first_name | last_name | address |
+----+------------+-----------+---------+
| 1  |     x      |     y     |    z    |
| 2  |     a      |     b     |    c    |
| 3  |     p      |     q     |    r    |
+----+------------+-----------+---------+
+----+--------------+------------+--------+
| 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();
还有一张像这样的转移台

+----+------------+-----------+---------+
| id | first_name | last_name | address |
+----+------------+-----------+---------+
| 1  |     x      |     y     |    z    |
| 2  |     a      |     b     |    c    |
| 3  |     p      |     q     |    r    |
+----+------------+-----------+---------+
+----+--------------+------------+--------+
| 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();
现在我可以像这样使用连接查询

+----+------------+-----------+---------+
| id | first_name | last_name | address |
+----+------------+-----------+---------+
| 1  |     x      |     y     |    z    |
| 2  |     a      |     b     |    c    |
| 3  |     p      |     q     |    r    |
+----+------------+-----------+---------+
+----+--------------+------------+--------+
| 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();
但是这样做只会给我与from_user_id相对应的名字和姓氏。但是我还需要对应于用户id的名字和姓氏。如何获取它们

我想要的输出表

+---------+---------+--------+
| sent_by | sent_to | amount |
+---------+---------+--------+
|   xy    |   ab    |   20   |
|   ab    |   xy    |   10   |
|   pq    |   ab    |   10   |
+---------+---------+--------+
下面是生成上表所需的MySQL查询。如您所见,它需要两个内部联接:

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

在联接表上使用别名。 希望有帮助

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

以下是我尝试为您的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();

诀窍在于知道如何为从传输到用户表的双连接包含别名,以及使用DB::raw访问MySQL CONCAT函数。

您应该向我们显示所需的输出表。@TimBiegeleisen查看更新的问题解决此问题的最简单方法是在MySQL中创建一个视图,然后创建一个仅从视图读取的Laravel只读模型。这样,您就可以避免查询生成器方面的所有恶作剧,您的代码将更简单、更小,查询视图比在运行时连接表要快一点。我想你不明白我的问题我明白你想用查询生成器从一个查询中同时获取转帐的发送者和接收者的信息,是吗?//编辑:对不起,你是对的,我很理解,但提供了一个错误的查询,我现在更正它;