Eloquent:如何从三个相关表中获取数据?

时间:2016-12-31 20:03:09

标签: laravel eloquent

我正在尝试将所有ordersProductEvent相关联。

必须参考:

  • 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,请如何获取与此活动相关联的同一产品的订单数量。

2 个答案:

答案 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。