我正在尝试将所有orders
与Product
和Event
相关联。
必须参考:
order.date == event.date
和order.order_product_id == event.product_id
以下是我的代码:
产品: [id, name]
。
class Product
// get Product related events
public function events()
{
$this->hasMany(Order::class)
}
// get Product related orders
public function orders()
{
$this->hasMany(Event::class)
}
活动: [id, product_id, date]
class Event
// get related Product
public function product()
{
$this->belognsTo(Product::class)
}
订单: [id, date, order_product_id]
public function product()
{
$this->belognsTo(Product::class,'order_product_id')
}
// I Want to get all Events, where present Product with 'order_product_id'
public function scheduled()
{
$this->hasMany(Product::class,'order_product_id', 'product_id')
}
总结:
如果我有Event
id=9
,请如何获取与此活动相关联的同一产品的订单数量。
答案 0 :(得分:2)
要计算订单表中包含相同产品的订单数量,您可以使用withCount()
:
$eventId = 9;
$product = Product::whereHas('events', function($q) use ($eventId ){
$q->where('id', $eventId);
})
->withCount('orders')
->get();
此代码将返回Product
附加属性orders_count
。
另一种方法是使用简单的查询:
$productId = Event::where('id', 9)->first()->id;
$ordersCount = Order::where('order_product_id', $productId)->count();
此外,您的关系中存在错误。 orders()
指向Event
类,events()
指向Order
。
答案 1 :(得分:0)
我解决了这个问题。
添加到Event model类的两个方法:
public function scheduledOrders()
{
return $this->orders()->whereHas('product', function ($q) {
$q->whereHas('scheduled', function ($q) {
$q->whereRaw("events_table.date = orders_table.date")->where('id',$this->id);
});
})->get();
}
public function orders()
{
return $this->hasMany(Order::class, 'order_product_id', 'product_id');
}
当我们得到具体事件时,我们可以查看具有相同日期和product_id的所有相关订单。
$scheduledOrders = Event::find(14)->scheduledOrders();
scheduledOrders()方法将返回具有相同日期的相关订单[Collection]和具有此事件的product_id。