三个主要表格:
产品
广告客户
位置
两个数据透视表:
advertisers_locations
products_locations
关系:
产品属于广告客户,广告客户拥有多个位置(可向其发送产品的位置)
产品还可以拥有自己的一组位置,以覆盖广告客户的位置(某些产品有交付限制)
我需要做的是:
选择所有产品
检查products_locations表是否有产品ID并加入。
如果它不存在,请加入广告客户位置表
这可以在一个查询中使用并使用雄辩的吗?这是我的代码 - 挣扎于条件:
public function scopeWhereShippableToLocation($query)
{
$location_id = session('location_id');
$query->where(function ($q) use ($location_id) {
$q->join('products_locations', 'products_locations.product_id', '=', 'products.id')
->where('products_locations.location_id', '=', $location_id);
});
$query->orWhere(function ($q) use ($location_id) {
$q->join('advertisers_locations', 'advertisers_locations.advertiser_id', '=', 'products.advertiser_id')
->where('advertisers_locations.location_id', '=', $location_id);
});
//dd($q->toSql());
return $query;
}
目前正在产生MySQL错误:
Column not found: 1054 Unknown column 'products_locations.location_id' in 'where clause' (SQL: select `products`.*,
答案 0 :(得分:2)
我认为我有一个使用eloquent而不是查询构建器的解决方案。您需要检查关系是否存在,如果不存在则需要另一个查询。这可以使用以下方法完成:
git am 0001.xxx.patch --directory=module-A/
如果您设置了git apply
,public function scopeWhereShippableToLocation($query)
{
$location_id = session('location_id');
// WhereHas check to see if a relationship exists, IE: The pivot table
// orWhereHas will be checked if the first where does not exist
$query->whereHas('products_locations', function ($q) use ($location_id) {
$q->where('location_id', $location_id);
})->orWhereHas('advertisers_locations', function ($q) use ($location_id) {
$q->where('location_id', $location_id);
});
return $query;
}
和Products
关系方法,这应该可行。