Laravel如何生成SQL查询

时间:2019-04-08 08:58:16

标签: php laravel laravel-5.8

我建立了一对多关系。这是模型类。

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();

这是我得到的查询日志。我看不到photo ='ut.jpg'。那么laravel如何生成SQL?

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

5 个答案:

答案 0 :(得分:3)

尝试

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

必须使用->photos()代替->photos

有关使用sql查询的信息

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

答案 1 :(得分:1)

您使用以下方法查询了所有照片:

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

使用User::find(1)->photos会收到Laravel Collection。这些集合也具有where方法。因此,基本上,您正在运行SQL来获取User 1的所有照片,然后仅过滤该集合以仅向您显示带有照片ut.jpg的项目。

相反,您可以使用方括号来获取关系,然后对其进行查询。 您的查询将变为

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

在使用$photos进行查询时,应将其命名为$photo而不是first,这只会导致一个对象(或为空)。

答案 2 :(得分:0)

您可以尝试一下吗?

$photo = 'ut.jpg';

$photos = User::find(1)->whereHas('photos', function ($query) use($photo){
return $query->where('photo', $photo);
})->first();

答案 3 :(得分:0)

您的查询$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();

那是获取用户照片的正确查询

答案 4 :(得分:0)

您可以: 运行选择查询

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

所有这些都在: -https://laravel.com/docs/5.0/database