Eloquent Union - ошибка SQL "идентификатор столбца уже существует"

Я определил связь между несколькими типами магазинов и методами оплаты, показывающими, какой магазин предлагает какой способ оплаты. Это определяется через morphToMany. Поэтому при вызове $shop->paymentMethods() он вернет все активные способы оплаты.

Теперь у меня также реализована функция локализации, которая работает следующим образом: текущий языковой стандарт, в котором вы работаете, сохраняется в сеансе. Затем есть таблица локализаций, в которой хранятся локализованные элементы (в данном случае: измененная модель магазина), поскольку разные страны снова будут предоставлять разные способы оплаты для одного и того же магазина. Эта локализация затем также сохраняет массив прикрепленных идентификаторов при изменении отношения в представлении локализации, так что способы оплаты могут быть добавлены и удалены во вспомогательном представлении. В этом примере они хранятся в$shop->paymentMethods_en

Теперь легко исключить отношения, существующие в корневом представлении, вызвав подзапрос ->whereIn('payment_methods.id', $this->paymentMethods_en).

Что вызывает проблемы, так это отображение дополнительных способов оплаты, которые не существуют в корневом каталоге и, следовательно, также не существуют в таблице отношений. Я попытался использовать объединение, а затем оставил внешнее соединение таблицы отношений, которое исключает все элементы, которые уже определены в корневом наборе данных. В противном случае, например, ID 1 будет загружен дважды. Затем к выходным данным добавляются все оставшиеся идентификаторы способов оплаты.

Пока так хорошо. Фактически, табличное представление загружается, как ожидалось (laravel nova), показывая также дополнительные способы оплаты, но когда nova пытается подсчитать существующие модели для разбивки на страницы, я получаю сообщение об ошибке:Column already exists (1060): duplicate column name 'id'

Shop.php

function paymentMethods() {

  $fields = array_map(function ($el) {
      return 'name as pivot_' . $el;
  }, Payables::PIVOT_FIELDS);

  return $this->morphToMany('App\PaymentMethod', 'payable')
    ->withPivot(Payables::PIVOT_FIELDS)
    ->using(Payables::class)
    ->where(function ($q) {
        if (isset($this->paymentMethods_en)) {
            $q->whereIn('payment_methods.id', $this->paymentMethods_en);
        }
    })
    ->unionAll(function ($q) use ($fields) {
        $q->select($fields)
            ->from('payment_methods')->join('payables', 'payment_methods.id', '=', 'payables.id', 'left outer')
            ->where('payables.payable_id', '=', $this->id)
            ->where('payables.payable_type', '=', self::class)
            ->whereIn('payment_methods.id', $this->paymentMethods_en);
    });
}

Согласно SQL UNION двух запросов, ошибка повторяющегося имени столбца, мне пришлось бы явно назвать столбцы, что невозможно с использованием красноречивых методов. Есть идеи, как обойти эту проблему - или другой подход к тому, как прикрепить недостающие отношения?!

Ценю вашу помощь!

0 ответов

Другие вопросы по тегам