Laravel Eloquent запрос «многие ко многим», создающий дополнительный ноль оператор WHERE - PullRequest
0 голосов
/ 18 мая 2019

Я использую Eloquent для получения результатов из запроса, состоящего из трех таблиц:

photos              (id)
photos_to_photosets (photo_id, photoset_id)
photosets           (id)

У моих моделей отношения "многие ко многим" определены как:

class Photo extends Model
{
    public function photosets()
    {
        return $this->hasMany(PhotoSet::class, 'photos_to_photo_sets');
    }
}

И

class PhotoSets extends Model
{
    public function photos()
    {
        return $this->belongsToMany(Photo::class, 'photos_to_photo_sets');
    }

}

Теперь, чтобы получить результаты, я вынужден использовать следующий код Eloquent:

$photoData = $this->photoSets->photos()
                             ->orWhere('photo_set_id', '=', $id)
                             ->get();

Это приводит к следующему запросу:

SELECT * FROM `photos` 
INNER JOIN `photos_to_photo_sets` 
     ON `photos`.`id` = `photos_to_photo_sets`.`photo_id` 
WHERE `photos_to_photo_sets`.`photo_set_id` is null 
     OR `photo_set_id` = ?

Этот запрос работает, но я не могу удалить WHERE `photos_to_photo_sets`.`photo_set_id` is null из запроса.

Я пытался просто использовать ->where('photo_set_id', '=', $id), но нулевое предложение все еще остается;еще хуже то, что получается следующее предложение WHERE:

... WHERE `photos_to_photo_sets`.`photo_set_id` IS NULL 
        AND `photo_set_id` = ?

Есть ли способ, используя Eloquent, удалить этот нулевой сегмент предложения WHERE?

В идеале я хотел бы закончить следующим запросом:

SELECT * FROM `photos` 
INNER JOIN `photos_to_photo_sets` 
     ON `photos`.`id` = `photos_to_photo_sets`.`photo_id` 
WHERE `photo_set_id` = ?

Заранее благодарю за любую помощь!

ОБНОВЛЕНИЕ

Исходя из ответа @Jonas Staudenmeir, нулевое предложение WHERE было удалено.

Для этого я установил идентификатор модели photoSet перед выполнением запроса.Полученный код был:

$this->photoSets->id = $photoset_id;

$photoData = $this->photoSets->photos()->get();

, который произвел:

SELECT * FROM `photos` 
INNER JOIN `photos_to_photo_sets` 
     ON `photos`.`id` = `photos_to_photo_sets`.`photo_id` 
WHERE `photo_set_id` = ?

1 Ответ

1 голос
/ 18 мая 2019

Введенная модель не имеет id:

$this->photoSet->id = $id;

Тогда вам не нужно дополнительное ограничение:

$photoData = $this->photoSets->photos;
...