大佬教程收集整理的这篇文章主要介绍了如何在父子(hasMany() 关系)上应用 Laravel Eloquent where() 条件,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个名为 EmailList
的 Laravel Eloquent 模型和一个名为 Subscriber
的模型。
我在 EmailList 上定义了以下 hasmany 关系。
public function subscribers() {
return $this->hasmany(Subscriber::class);
}
这种关系运作良好。
我现在想对父级应用 where()
条件,对子级应用 where()
条件。
例如,我有两个 EmailList
,具有一个属性 ID
和一个名为 Listname
的属性(“列表 A”和“列表 B”)。我的 Subscriber
模型有四个相关属性:ID
、name
、email
和 email_List_ID
。
问题:我想从某个列表中获取所有订阅者,例如“列表 A”,并使用 $query
(livewire 的搜索功能)过滤订阅者。
为了实现这一点,我想出了以下代码:
EmailList::where('Listname',$ListName)->first()
->subscribers()
->where('name','liKE','%'.$this->search.'%')
->orWhere('email','%'.$this->search.'%')
->paginate(50) //or get(),if you like
此代码部分起作用,因为确实过滤了订阅者,但没有过滤电子邮件列表。换句话说,我只是搜索了所有订阅者,而不是特定列表中的订阅者。
经过大量搜索后,我发现我可能应该使用 whereHas()
,但是当我尝试使用它时,它只给了我电子邮件列表而不是订阅者。
如果有人能帮我过滤这个就好了。对于有经验的开发者来说,这可能是小菜一碟?,但它对我有很大帮助!
更新: 看到 EricLandheer 的回答后,我意识到(当然)我也有 EmailList ID。也许这使它更简单一点,以便您可以使用 find() 而不是 where()->first() 子句。 (我使用 first() 因为“Listname”是唯一的,我只想要一个实例。对吗?)
目前,您的代码仅返回第一个 EmailList
。您是故意这样做的,还是只想要第一个具有 EmailList
的 $listname
?
这是一个使用 Eager loading with consTraints 的解决方案,它通过回调覆盖 subscribers
关系。结果应该是所有带有 EmailLists
的 $listname
以及带有搜索的匹配订阅者。
EmailList::where('listname',$listName)
->with('subscribers',function($query) {
return $query->where('name','LIKE','%'.$this->search.'%')
->orWhere('email','%'.$this->search.'%')
})->get();
关于问题更新
确实,使用 Listname 很好。如果它是唯一的,没问题。您可以将 find()
与 ID 一起使用,如果您打算在稍后阶段更改 EmailList
的名称,则更可取。
也许更优雅/可读的解决方案是:
$emailList = EmailList::firstWhere('listname',$listName);
$emailList->subscribers = $emailList->subscribers()
->where('name','%'.$this->search.'%')
->orWhere('email','%'.$this->search.'%')
->get();
如果您在更多地方使用它,您可以将搜索重构为模型/服务:
// EmailList model
public function subscribers()
{
return $this->hasmany(Subscriber::class);
}
public function searchSubscribers(String $search): Collection
{
return $this->subscribers()
->where('name','%'.$this->search.'%')
->orWhere('email','%'.$this->search.'%')
->get();
}
最终代码
$emailList = EmailList::firstWhere('listname',$listName);
$emailList->subscribers = $emailList->searchSubscribers($this->search);
以上是大佬教程为你收集整理的如何在父子(hasMany() 关系)上应用 Laravel Eloquent where() 条件全部内容,希望文章能够帮你解决如何在父子(hasMany() 关系)上应用 Laravel Eloquent where() 条件所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。