Laravel表加入

时间:2017-10-29 02:21:13

标签: php laravel laravel-eloquent

我试图做一些表连接并遇到麻烦。我需要显示 客户的完整名称和标题,项目描述,订购数量,对于2000年4月之后订购的每个项目。我制作了一个有效的SQL脚本,但我需要使用Laravel ORM。

SELECT  `first_name`,`last_name`,o.order_id,`quantity`,`description`,`date_placed`
FROM `customer` c 
JOIN `order` o
  ON c.`customer_id` = o. `customer_id` 
JOIN `orderline` ol
  ON o.`order_id` = ol. `order_id` 
JOIN `item` i
  ON ol.`item_id` = i. `item_id`
WHERE `date_placed` > '2000-4-00';

我为表创建了2个模型" Customer"," Order"

这是我的客户模型

public function orders(){
    return $this->hasMany('App\Order','customer_id');
}

这是我的订单型号

public function orderline(){
    return $this->hasMany('App\Orderline','order_id');
}

现在我能够获得一些数据,但我不觉得这是一个很好的方式

$customer = Customer::all();
foreach($customer as $input){
        $item = Customer::find($input->customer_id)->orders;
        $name = $input->title . ' ' . $input->first_name . ' ' . $input->last_name;

        $datePlaced = null;
        $orderID = null;
    foreach($item as $value){
        $orderID = $value->order_id;
        $datePlaced = $value->date_placed;
        $order = Order::find($value->order_id)->orderline;
    }

如果有人能指出我正确的方向,那就太好了。

1 个答案:

答案 0 :(得分:2)

看起来您想要使用CustomerOrder来获取所有OrderLine个?

Customer::with(['order' => function ($query) {
    $query->where('date_placed', '>=', '2000-04-01')->with('orderline');
}])->get();

如果您想限制关系中的列,您可以......

Customer::with(['order' => function ($query) {
    $query->select(/* columns */)->where('date_placed', '>=', '2000-04-01')
          ->with(['orderline' => function ($query) {
              $query->select(/* columns here */);
          }]);
}])->get();

只需确保在关系中指定列,即为每个关系选择所有外键或相关列。