Если вы заметите сигнатуру 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();
Надеюсь, это даст вам представление о том, как вы можете обновить ваши отношения, чтобы получить желаемый запрос.Если вы добавите нужную структуру таблицы и данные, я могу дополнить ответ связями для вас.