Laravel5 Eloquent Query

时间:2015-04-28 18:00:35

标签: laravel eloquent laravel-5

我是Laravel的新手并且遇到了疑问。我有ShopCustomer表,其中包含shop_id和customer_id。其中有shop_id和不同customer_id的多个条目。它有很多甚至很多的关系。

我有一个shop_id = 2.我想通过他们的名字找到客户='Mat'。我用JOIN子句尝试了我的代码。我希望将以下查询转换为Eloquent Query构建器,并希望使用Eager Loading。

$customers = \DB::table('shop_cust')
            ->join('customers', 'customers.customer_id', '=', 'shop_cust.customer_id')
            ->select('shop_cust.total_amount', 'customers.*')
            ->where('customers.name', 'LIKE', 'Mat')
            ->where('shop_cust.shop_id', '=', '2')
            ->get();

dd($customers);

这就是我的尝试。

$customers = ShopCust::with(['customer' => function ($query)
 use ($customerName) {
      $query->where('name', 'LIKE', '%' . $customerName . '%');
 }])->where('shop_id','=', $shopId)->get();

2 个答案:

答案 0 :(得分:1)

ShopCustomer模型

class ShopCustomer Eloquent {

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


    public function shops()
    {
    return $this->hasMany('Shop','shop_id','shop_id');
    }

}

客户模式

class Customer Eloquent {

    public function customer_shop()
    {
    return $this->belongToMany('ShopCustomer','customer_id','customer_id');
    }

}

商店模特

class Shop Eloquent {

        public function shop_customer()
        {
        return $this->belongToMany('ShopCustomer','shop_id','shop_id');
        }

    }

您的查询

$customers = ShopCustomer::
    ->with(arra('customer' => function($q) use ($customerName){
                                        $query->where('name', 'LIKE', '%' . $customerName . '%');
                                    }))
    ->where('shop_id','=', $shopId)->get();

答案 1 :(得分:0)

您所描述的是商店和客户之间的多对多关系。您的shop_cust表只是关系的数据透视表。除非你有一些shop_cust的特殊功能,否则它不需要为它定义模型。

class Shop extends Model {
    public function customers() {
        return $this->belongToMany('Customer', 'shop_cust');
    }
}

class Customer extends Model {
    public function shops() {
        return $this->belongToMany('Shop', 'shop_cust');
    }
}

使用此定义,您的代码将如下所示:

$shop = Shop::find(2);
$customers = $shop->customers()->where('name', 'LIKE', 'Mat');

由于您只关注某个特定商店的客户,因此没有真正需要在此处加载。

修改

如果您要访问的数据透视表上有额外的字段,您也可以这样做。首先,使用关系上的withPivot()方法添加对额外字段的访问权限:

class Shop extends Model {
    public function customers() {
        return $this->belongToMany('Customer', 'shop_cust')->withPivot('foo', 'bar');
    }
}

class Customer extends Model {
    public function shops() {
        return $this->belongToMany('Shop', 'shop_cust')->withPivot('foo', 'bar');
    }
}

现在,您可以通过pivot模型属性访问数据:

foreach ($customers as $customer) {
    echo $customer->pivot->foo;
    echo $customer->pivot->bar;
}

使用数据透视表here的文档。