Laravel加入使用以获得一对多关系?

时间:2019-07-11 09:57:18

标签: mysql laravel join

有什么方法可以使用laravel中的联接获取关系数据(一对多关系记录),而无需在collection中创建不同的记录:

示例:

 $orders  = DB::table('orders')
                     ->join('users', 'users.id', '=', 'orders.users_id')
                     ->join('order_items', 'order_items.order_id', '=', 'orders.id')
                     ->select('users.*', 'order_items.*')
                     ->get();

所以这里发生的是,如果订单有6个项目,它会创建6条记录,但是我想要类似单条记录的东西,其中有数组或集合,其中列出了订单项。

我想要的输出通常是以下顺序:

Collection {# ▼
  #items: array:[▼
          0 => {
            +'id':1,
              ...,
            + 'items: [
                     //here i want all the records of relation order items
           ]
      }
 ]
}

是否有任何方法可以不使用 with() load()而仅使用联接或原始查询来获得此结果?

3 个答案:

答案 0 :(得分:0)

您应该尝试以下操作:

$orders  = DB::table('orders')
                     ->select('users.*', 'order_items.*')
                     ->leftJoin('users', 'users.id', '=', 'orders.users_id')
                     ->leftJoin('order_items', 'order_items.order_id', '=', 'orders.id')
                     ->get();

答案 1 :(得分:0)

这个答案是推测性的,但也许您想为每个用户报告一行,并附上一份订单项的CSV列表:

$orders = DB::table('orders AS o')
    ->join('users AS u', 'u.id', '=', 'o.users_id')
    ->join('order_items AS oi', 'oi.order_id', '=', 'o.id')
    ->select('u.id', DB::raw('GROUP_CONCAT(oi.name) AS orders'))
    ->groupBy('u.id')
    ->get();

答案 2 :(得分:0)

如果没有理由阻止您使用Eloquent,那是使用数据库的最佳方法。

  

Laravel随附的Eloquent ORM提供了一个美丽,简单的方法   ActiveRecord实现可与您的数据库一起使用

这里是文档Eloquent: Getting Started

在laravel中,模型关系变得容易,您可以按以下方式获得所需的信息:

用户模型关系:

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

订单模型关系:

//order items
public function items() {
    return $this->hasMany('App\OrderItem');
}

//order owner
public function user() {
    return $this->belongsTo('App\User');
}

OrderItem模型关系:

//order
public function order() {
    return $this->belongsTo('App\Order');
}

这是您如何获取订单商品的快速示例

$orders = User::find($id)->orders
foreach($orders as $order) {
    $orderItems = $order->items;
}

您可以按照自己喜欢的方式进行收集,但是强烈建议使用Eloquent Resources,因为当今大多数应用程序都希望JSON响应。