Laravel:渴望加载本地范围

时间:2016-01-15 13:03:48

标签: php laravel eloquent

我有一个与产品模型有多对多关系的优惠券模型(带有数据透视表等等)。我创建了一些本地范围,只获得可用的优惠券,并且只获得确定类别的优惠券:

public function scopeAvailable($query)
{    
    return $query->where('available', '>', 0);
}

public function scopeOfCategory($query, $category)
{
  return $query->join('categories', 'categories.id', '=', 'coupons.category_id')
    ->where('categories.slug', $category);
}

我想急切加载某些类别的所有可用优惠券及其各自的产品。所以我正在做:

$coupons = Coupon::with('products')->available()->ofCategory($category)->paginate(20);

如果我拨打$coupons->first(),我可以看到有关优惠券的信息。但如果我打电话给$coupons->first()->products,我会得到一个空数组。

如果我评论->ofCategory($category)部分,它会按预期工作。

这是我的模特:

class Coupon extends Model
{

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

class Product extends Model
{
  public function coupons()
  {
    return $this->belongsToMany('App\Coupon');
  }
  ...
}

我正在使用Laravel 5.2。我做错了什么?

修改 它看起来像我的类别的问题。如果我试图在"其他"上获得优惠券类别,我按预期获得了优惠券。如果我试图在电子产品上获得优惠券"类别,我得到了没有产品的优惠券。我很确定我在电子产品和电子产品上都有优惠券。和"其他"类别。

如果我转储Category::where('slug', '=', 'electronics')->first()

...
protected 'attributes' => 
  array (size=3)
    'id' => int 1
    'name' => string 'Electronics' (length=11)
    'slug' => string 'electronics' (length=11)
...

如果我转储Category::where('slug', '=', 'other')->first():     ...     受保护的属性' =>       数组(大小= 3)         ' ID' => int 2         '名称' =>字符串'其他' (长度= 5)         '蛞蝓' =>字符串'其他' (长度= 5)     ...

编辑2: 我用"其他"创建了另一张优惠券。类别,所以我有两个这个类别的优惠券。当我打印优惠券时,它会显示第一张优惠券两次。

1 个答案:

答案 0 :(得分:1)

coupons

| id |    name    | available | category_id |
|----|------------|-----------|-------------|
| 1  | Coupon #1  |     1     |     1       |
| 2  | Coupon #2  |     1     |     1       |
| 3  | Coupon #3  |     1     |     1       |

products

| id |    name     |
|----|-------------|
| 1  | Product #1  |
| 2  | Product #2  |
| 3  | Product #3  |

coupon_product

| id |product_id| coupon_id |
|----|----------|-----------|
| 1  |     1    |     1     |
| 2  |     2    |     1     |

categories

| id |    slug     |
|----|-------------|
| 1  | category-1  |
| 2  | category-2  |
| 3  | category-3  |

Product.php

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{
    public function coupons()
    {
        return $this->belongsToMany('App\Coupon');
    }
}

Coupon.php

class Coupon extends Model
{
    public function products()
    {
        return $this->belongsToMany('App\Product');
    }

    public function scopeAvailable($query)
    {
        return $query->where('available', '>', 0);
    }

    public function scopeOfCategory($query, $category)
    {
        return $query->join('categories', 'categories.id', '=', 'coupons.category_id')
            ->where('categories.slug', $category);
    }
}

最后当我跑步时:

$coupons = App\Coupon::with('products')->available()->ofCategory('funny')->first();
dd($coupons->products);

我明白了:

enter image description here

哪个是对的。您可以发布有关项目当前状态的更详细信息吗?