Laravel:一对多对多,检索distinct()值

St0*_*0rM 8 laravel laravel-4

Laravel 4项目,使用Eloquent ORM.

我有三个表:客户,订单和产品(+ 1个数据透视表order_product).客户与订单一对多关联.订单与产品多对多关联.

Customers  1-->N  Orders  N<-->N   Products
Run Code Online (Sandbox Code Playgroud)

我想在Customer模型上有一个方法来检索客户正在购买的产品列表.

为了更好地理解这一点,假设产品是消耗品.

例如,客户#1可以放置:

  • 产品A,B和C的订单#1;
  • 产品A,C和D的订单#2;
  • 产品C和E的订单#3;

...我想要检索的结果是带有产品A,B,C,D和E的集合.

模型是(在运行中伪编码):

class Product extends Eloquent {

    public function orders()
    {
        return $this->belongsToMany('Order');
    }

}

class Orders extends Eloquent {

    public function customer()
    {
        return $this->belongsTo('Customer', 'customer_id');
    }

    public function products()
    {
        return $this->belongsToMany('Product');
    }

}

class Customers extends Eloquent {

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

    public function products()
    {
        // What to put here ???
    }

}
Run Code Online (Sandbox Code Playgroud)

St0*_*0rM 6

感谢@deczo 的回答,我能够建立一个查询方法来检索项目:

public function items()
{
    $query = DB::table('items')->select('items.*')
        ->join('item_order', 'item_order.component_id', '=', 'items.id')
        ->leftJoin('orders', 'item_order.order_id', '=', 'orders.id')
        ->leftJoin('customers', 'customers.id' , '=', 'orders.customer_id')
        ->where('customers.id', $this->id)
        ->distinct()
        ->orderBy('items.id');

    $eloquent = new Illuminate\Database\Eloquent\Builder( $query );
    $eloquent->setModel( new Item );
    return $eloquent->get();
}
Run Code Online (Sandbox Code Playgroud)


Mei*_*lym 5

这是多对多关系,但以Orders表作为数据透视表。

class Customers extends Eloquent {

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

    public function products()
    {
        return $this->belongsToMany('Products', 'orders', 'customer_id', 'product_id');
    }
}
Run Code Online (Sandbox Code Playgroud)

我已经包含了最后两个参数,但如果您遵循 Single_id 模式,则可以将它们省略。

可以接收不同的产品模型,如下所示:

public function products()
{
    return $this->belongsToMany('Products', 'orders', 'customer_id', 'product_id')
        ->distinct();
}
Run Code Online (Sandbox Code Playgroud)