如何在 laravel eloquent 中查询多个关系
Posted
技术标签:
【中文标题】如何在 laravel eloquent 中查询多个关系【英文标题】:How to query multiple relationships in laravel eloquent 【发布时间】:2017-10-24 16:27:26 【问题描述】:我在 laravel eloquent 中查询多个关系时有点卡在这里我有像
这样的原始查询SELECT * FROM tblSchedules,tblUserHomeCourts,tblHomeCourts
where tblHomeCourts.userId=6
and tblHomeCourts.homeCourtId=5
and (tblSchedules.timeFrom <= 1495617580
and tblSchedules.timeTo >= 1495617580)
and tblUserHomeCourts.userHomeCourtStatus=1
and tblSchedules.scheduleStatus=0
现在我需要将这个原始查询查询到 laravel eloquent 中。我试过这样做
$getSchedule= Schedule::with(['userSchedule' => function($query) use ($userId,$homeCourtId,$timeFrom, $timeTo)
$query->where(['userId'=> $userId,'homeCourtId'=>$homeCourtId,'userHomeCourtStatus' => Constant::STATUS_1]);
]) ->where('timeFrom','<=',$timeFrom)
->where('timeTo','>=',$timeTo)
->where(['scheduleStatus'=>Constant::STATUS_0])
->get();
但我没有得到结果,而是得到了我应该得到记录的空白消息数组。
问题: 我做错了什么? 建议我查询此查询的正确方法。
调度模型
public function friendsFeed()
return $this->hasOne(UserHomeCourt::class,'userHomeCourtId','userHomeCourtId')->with('user')->with('homeCourt');
public function userSchedule()
return $this->hasOne(UserHomeCourt::class,'userHomeCourtId','userHomeCourtId')->with('homeCourt');
UserHomeCourt 模型
public function homeCourt()
return $this->belongsTo(HomeCourt::class,'homeCourtId','homeCourtId');
public function user()
return $this->belongsTo(User::class,'userId','userId');
主场模式
public function friendsFeed()
return $this->hasOne(UserHomeCourt::class, 'homeCourtId', 'homeCourtId');
public function userSchedule()
return $this->hasOne(UserHomeCourt::class, 'homeCourtId', 'homeCourtId');
我从 SQL Query得到的回复
【问题讨论】:
where('timeFrom','>=',$timeFrom) ->where('timeTo','<=',$timeTo)
条件不同然后查询。
那么什么是实现查询结果的正确方法请正确
即使在做同样的事情后我也得到空白响应
【参考方案1】:
从你的sql到eloquent的时间检查是错误的,当你将多个条件传递给where
时,你需要将条件设置为一个数组。
$getSchedule= Schedule::with(['userSchedule' => function($query) use ($userId, $homeCourtId)
$query->whereHas('homeCourt', function ($query) use ($userId, $homeCourtId)
$query->where('userId', $userId)
->where('homeCourtId', $homeCourtId);
)->where('userHomeCourtStatus', 1);
])
->where('timeFrom', '<=', $timeFrom)
->where('timeTo', '>=', $timeTo)
->where('scheduleStatus', 0)
->get();
【讨论】:
同样的空白消息数组 :( @BhavikBamania 我刚刚注意到您的主查询中有 3 个表。你能分享你的关系吗 是的,在用户计划模型中我已经关联了这两个表,这就是我在这里使用它的原因 是的,给我一秒钟 @BhavikBamania 在您的帖子中分享 3 个模型数据。我会制作正确的查询。【参考方案2】:尝试使用whereHas
函数:
Schedule::whereHas('userSchedule', function ($query)
$query->where('userId', $userId)
->where('homeCourtId', $homeCourtId)
->where('userHomeCourtStatus', Constant::STATUS_1);
)
->where('timeFrom', '<=', $timeFrom)
->where('timeTo', '>=', $timeTo)
->where('scheduleStatus', Constant::STATUS_0)
->get();
【讨论】:
还是一样的东西..消息数组中没有任何内容 为什么你在关系中使用相同的foreign_id
和local_id
,应该是不同的
你能添加你的表结构吗
所以tblSchedules
中的主键是userHomeCourtId
?
所以你在tblSchedules
中有scheduleId
并且它与tblUserHomeCourts
中的scheduleId
相关,那么关系应该是hasOne(UserHomeCourt::class,'scheduleId','scheduleId')
而不是以上是关于如何在 laravel eloquent 中查询多个关系的主要内容,如果未能解决你的问题,请参考以下文章
Laravel Eloquent 多对多查询 whereIn
Laravel 5 / Eloquent - 对属于多的关系进行查询过滤
如何使用 Eloquent 在 Laravel 中开始查询?
如何在 Laravel 5.8 中使用 Eloquent 进行查询?