Как Laravel генерирует SQL-запросы

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

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

person user3351236    schedule 08.04.2019    source источник
comment
Возможный дубликат Laravel, где объект отношения   -  person Harun Yilmaz    schedule 08.04.2019


Ответы (5)


Попробуй это

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

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

Для просмотра использования запроса sql

$sql = User::find(1)->photos()->where('photo', 'ut.jpg')->toSql();
person Davit    schedule 08.04.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, что приведет только к одному объекту (или нулю).

person Matthias S    schedule 08.04.2019

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

$photo = 'ut.jpg';

$photos = User::find(1)->whereHas('photos', function ($query) use($photo){
return $query->where('photo', $photo);
})->first();
person kapitan    schedule 08.04.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();

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

person Mohammad hayajneh    schedule 08.04.2019
comment
Я взял пример из документации laravel.com/docs/5.8/eloquent -отношения#один ко многим. $comment = App\Post::find(1)-›comments()-›where('title', 'foo')-›first(); Результат, который я получил, правильный. Но запрос не. - person user3351236; 08.04.2019
comment
@user3351236 $comment = App\Post::find(1)-›comments()-›where('title', 'foo')-›first(); условие where находится в посте, а не в комментарии, а то, что вы сделали, было на фото, а не на пользователе. - person Mohammad hayajneh; 08.04.2019

Вы можете: Запустить запрос выбора

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

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

person benji127    schedule 08.04.2019