我建立了一对多关系。这是模型类。
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
答案 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]);