Если вы заметили сигнатуру метода отношения 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();
Надеюсь, это даст вам представление о том, как вы можете обновить свои отношения, чтобы получить желаемый запрос. Если вы добавите свою структуру таблицы и данные, которые хотите, я могу обновить ответ с помощью отношений для вас.
person
Mihir Bhende
schedule
20.02.2019
where
, которое вы показали? - person nice_dev   schedule 20.02.2019items()
, даже если иногда в этом нет необходимости. Это сделало бы его тесно связанным. Вместо этого создайте новый метод и присоедините к нему этот метод с помощью правильного соединения. Кроме того, если запрос генерируется самим этим методом, то выполняется какой-тоboot()
метод, присоединяющий этоwhere
условие каждый раз, когда он выполняется. Можете ли вы показать нам этот метод? - person nice_dev   schedule 20.02.2019where
является поведением Eloquent Builder по умолчанию, и мы хотели его изменить. Однако я обнаружил, что это не будет решено, и ядро Laravel нуждается в некоторых изменениях. github.com/laravel/ideas/issues/1528 - person Omid   schedule 20.02.2019This where condition is the default behavior of Eloquent builder
Такого никогда не бывает. Laravel определяет только отношения и соответственно включаетjoins
. Вы проверили, есть ли какой-либо методboot()
в любом из определений ваших моделей? Подробнее см. здесь. - person nice_dev   schedule 20.02.2019