运行选择查询两次或组合两个查询的最佳方式Laravel 5.3

时间:2017-02-16 22:17:59

标签: php mysql laravel

我有一个表Orders,其中包含customer_idsupplier_idorder_status等。

order_id|customer_id|supplier_id
--------|-----------|-----------
1       |1          |2

customer_idsupplier_id都与存储其数据的Users表相关,例如first_name last nameemail等..:

user_id|first_name|last_name
-------|----------|---------
1      | Jon      | Doe
2      | Jane     | Doe

我需要运行一个查询来提取订单数据,并从Users表中提取Customer和Supplier的数据。例如。结果必须是:

order_id|customer_first_name|customer_last_name|supplier_first_name|supplier_last_name
--------|-------------------|------------------|-------------------|------------------
1       |Jon                |Doe               |Jane               |Doe

我一直在尝试一些不同的方法,包括Laravel方法addSelect(我无法工作 - 得到非常奇怪的'找不到方法'错误)和PHP array_merge(和其他),但似乎没有提供要求的结果。

有人可以建议是否有特定的最佳做法或方法吗?

由于

2 个答案:

答案 0 :(得分:3)

这需要JOIN - 将users表格移至orders表格两次 - 首先是supplier_id,然后是customer_id。所以,查询将是:

SELECT order_id, customer_id, u1.first_name as customer_first_name,
u1.last_name as customer_last_name,

supplier_id, u2.first_name as supplier_first_name, 
u2.last_name as supplier_last_name

FROM orders o
    INNER JOIN users u1 ON
        o.customer_id = u1.user_id
    INNER JOIN users u2 ON
        o.supplier_id = u2.user_id

答案 1 :(得分:0)

你有没有看过PDO Transactions。结合foreach循环,我认为这样的事情可能符合您的要求。

  <?php 
$database->beginTransaction();
    $database->query("SELECT * FROM Orders ");
    $OrderData = $database->single();
    $database->query("SELECT * FROM Users WHERE user_id = :user_id");
    $database->bind(':user_id', $Data['customer_id']);
    $UserData = $database->single();
    foreach($UserData as $k=>$v)
    {
        $OrderData[$v] = $v;
    }
$database->endTransaction();
?>

关于PDO事务的美妙之处在于,如果任何查询失败,则不会返回任何内容,并且整个事情都会被取消,这是一个全有或全无的事情。