Как Laravel генерирует SQL-запросы - PullRequest
0 голосов
/ 08 апреля 2019

Я создал отношения один ко многим. Вот классы моделей.

class Photo extends Model
{
    public function user(){
        return $this->belongsTo('App\User');
    }
}

class User extends Authenticatable
{ 
    public function photos(){
        return $this->hasMany('App\Photo');
    }
}

Затем я пытаюсь получить фотографии:

$photos = User::find(1)->photos->where('photo', 'ut.jpg')->first();

Вот журнал запросов, который я получил. Я не вижу фото = 'ut.jpg'. Итак, как Laravel генерирует SQL?

select * from `photos` where `photos`.`user_id` = 1 and `photos`.`user_id` is not null

Ответы [ 5 ]

3 голосов
/ 08 апреля 2019

Попробуйте это

$photos = User::find(1)->photos()->where('photo', 'ut.jpg')->first();

необходимо использовать ->photos() вместо ->photos.

Для просмотра SQL-запроса используйте

$sql = User::find(1)->photos()->where('photo', 'ut.jpg')->toSql();
1 голос
/ 08 апреля 2019

Вы запросили все фотографии, используя это:

$photos = User::find(1)->photos->where('photo', 'ut.jpg')->first();

Используя User::find(1)->photos, вы получаете Коллекция Laravel . В этих коллекциях также есть метод where. В общем, вы запускаете SQL для получения всех фотографий User 1, а затем просто фильтруете эту коллекцию, чтобы показать вам только элемент с фотографией ut.jpg.

Вместо этого вы можете использовать скобки, чтобы получить связь, а затем запросить ее. Ваш запрос становится

$photos = User::find(1)->photos()->where('photo', 'ut.jpg')->first();

Вместо того, чтобы называть его $photos, вы должны назвать его $photo, так как вы запрашиваете с first - что приведет только к одному объекту (или нулю).

0 голосов
/ 08 апреля 2019

Ваш запрос $photos = User::find(1)->photos->where('photo', 'ut.jpg')->first(); неверен, laravel не увидел условие where, если вы сделаете это

User::whereHas('photos', function($q) {
      $q->where('photo', 'ut.jpg');

})->where('id',1)->first();

, то есть правильный запрос для получения фото пользователя

0 голосов
/ 08 апреля 2019

Вы могли бы: Выполнить запрос выбора

$photos = DB::select('select * from photos where id = ?', [1]);

Все это хорошо документировано в: - https://laravel.com/docs/5.0/database

0 голосов
/ 08 апреля 2019

Можете ли вы попробовать это:

$photo = 'ut.jpg';

$photos = User::find(1)->whereHas('photos', function ($query) use($photo){
return $query->where('photo', $photo);
})->first();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...