程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了如何在父子(hasMany() 关系)上应用 Laravel Eloquent where() 条件大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决如何在父子(hasmany() 关系)上应用 Laravel Eloquent where() 条件?

开发过程中遇到如何在父子(hasmany() 关系)上应用 Laravel Eloquent where() 条件的问题如何解决?下面主要结合日常开发的经验,给出你关于如何在父子(hasmany() 关系)上应用 Laravel Eloquent where() 条件的解决方法建议,希望对你解决如何在父子(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 模型有四个相关属性:IDnameemailemail_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,请注明来意。