有什么方法可以使用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()而仅使用联接或原始查询来获得此结果?
答案 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');
}
//order
public function order() {
return $this->belongsTo('App\Order');
}
$orders = User::find($id)->orders
foreach($orders as $order) {
$orderItems = $order->items;
}
您可以按照自己喜欢的方式进行收集,但是强烈建议使用Eloquent Resources,因为当今大多数应用程序都希望JSON响应。