Laravel Eloquent и Mysql присоединяются к таблице, если другое объединение не имеет значения - PullRequest
0 голосов
/ 25 апреля 2018

Три основных стола:

Продукты

Рекламодатели

Места

Две сводные таблицы:

advertisers_locations

products_locations

Отношения:

Продукт принадлежит рекламодателю, и у рекламодателя много мест (куда он может отправлять продукты)

Продукт также может иметь собственный набор местоположений, которые переопределяют местоположения рекламодателя (Некоторые продукты имеют ограничения по доставке)

Что мне нужно сделать, это:

  1. Выбрать все продукты

  2. Проверьте, содержит ли таблица products_locations идентификатор продукта, и присоединитесь к нему.

  3. Если его не существует, присоединитесь к таблице местоположений рекламодателей

Можно ли это сделать в одном запросе и использовать eloquent? Вот мой код - борюсь с условным:

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 голосов
/ 25 апреля 2018

Я думаю, у меня есть решение для вас, использующее eloquent, а не конструктор запросов. Вам нужно проверить, существует ли связь, если нет, вам нужен другой запрос. Это можно сделать с помощью следующего:

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, Advertisers и Locations.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...