Красноречивый hasMany с внешним ключом на совместном столе - PullRequest
0 голосов
/ 20 февраля 2019

Допустим, это:

class List extends Model
{
    public function items(){
        return $this->hasMany(Items::class, 'c.class_id', 'class_id')
            ->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
    }
}

Проблема в том, что Eloquent добавляет items к полю внешнего ключа, и окончательный запрос:

SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
// here it is
WHERE items.c.class_id = 10

Даже при использовании DB::raw('c.class_id') didn 'решить проблему.

1 Ответ

0 голосов
/ 20 февраля 2019

Если вы заметите сигнатуру hasMany метода отношения:

return $this->hasMany(Model::class, 'foreign_key', 'local_key');

Что означает, что когда Laravel сделает запрос, он будет рассматривать второй аргумент foreign_key как столбец table, определенный вModel::class.

Чтобы упростить в вашем случае:

return $this->hasMany(Items::class, 'c.class_id', 'class_id')->...

Оставив на некоторое время правое соединение, Laravel рассматривает c.class_id как внешний ключ таблицы Item::class, котораяна самом деле items таблица.

Итак, результирующий запрос:

SELECT * FROM items WHERE items.c.class_id = 10

Затем, когда вы добавляете правильное соединение, laravel просто добавляет в основной запрос и делает его:

SELECT * FROM items
RIGHT JOIN items_classes as c ON c.items_id = items.id
WHERE items.c.class_id = 10

Laravel не будет ссылаться items_classes в отношении, потому что вы относитесь List Модель к Item::class, а не ItemClass::class.

Я не уверен в данных, которые вам нужны, но вижуесли вы можете использовать как ниже:

class List extends Model
{
    public function items(){
        return $this->hasMany(Items::class, 'c.class_id', 'class_id');
    }

}


List::with(['items', function($q){

    return $q->->rightjoin('items_classes as c', 'c.items_id', '=', 'items.id');
}])->get();

Надеюсь, это даст вам представление о том, как вы можете обновить ваши отношения, чтобы получить желаемый запрос.Если вы добавите нужную структуру таблицы и данные, я могу дополнить ответ связями для вас.

...