如果另一个连接为空,则Laravel Eloquent和Mysql连接表

时间:2018-04-25 09:26:52

标签: php mysql laravel laravel-5

三个主要表格:

产品

广告客户

位置

两个数据透视表:

advertisers_locations

products_locations

关系:

产品属于广告客户,广告客户拥有多个位置(可向其发送产品的位置)

产品还可以拥有自己的一组位置,以覆盖广告客户的位置(某些产品有交付限制)

我需要做的是:

  1. 选择所有产品

  2. 检查products_locations表是否有产品ID并加入。

  3. 如果它不存在,请加入广告客户位置表

  4. 这可以在一个查询中使用并使用雄辩的吗?这是我的代码 - 挣扎于条件:

    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`.*, 
    

1 个答案:

答案 0 :(得分:2)

我认为我有一个使用eloquent而不是查询构建器的解决方案。您需要检查关系是否存在,如果不存在则需要另一个查询。这可以使用以下方法完成:

git am 0001.xxx.patch --directory=module-A/

如果您设置了git applypublic 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关系方法,这应该可行。