我有一个与产品模型有多对多关系的优惠券模型(带有数据透视表等等)。我创建了一些本地范围,只获得可用的优惠券,并且只获得确定类别的优惠券:
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: 我用"其他"创建了另一张优惠券。类别,所以我有两个这个类别的优惠券。当我打印优惠券时,它会显示第一张优惠券两次。
答案 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);
我明白了:
哪个是对的。您可以发布有关项目当前状态的更详细信息吗?