【问题标题】:Laravel Eloquent How to apply condition on "with" datas on the output?Laravel Eloquent 如何对输出的“with”数据应用条件?
【发布时间】:2020-04-21 21:08:28
【问题描述】:

这里是我的代码:

$prestations = Prestation::with(
            [
            'service' => function($service) use($searchService) {
                $service->select(['id','name'])->where('name', 'regexp', "/$searchService/i");
            },
            'facility' => function($facility) use($searchPartenaire) {
                $facility->select(['id','name'])->where('name', 'regexp', "/$searchPartenaire/i");
            }
            ]
        )
            ->where('name', 'regexp', "/$search/i")
            ->orderBy($orderBy, $orderDirection)
            ->simplePaginate(50);

        $res = [
            'results' => $prestations,
            'total' => Prestation::all()->count(),
        ];

问题在于,在 $searchService 和 $searchPartenaire 上“服务”和“设施”名称不相等的所有数据的输出中,值被替换为“null”。 所以我不想在搜索变量不等于的输出中有值。

谢谢。

【问题讨论】:

  • 你的意思是如果$searchService上的$service不相等,那条记录还是会出来,但是名字被null替换了?
  • @TsaiKoga 是的,完全正确!

标签: php laravel eloquent laravel-query-builder


【解决方案1】:

你可以这样试试

 $prestations = Prestation::with('service','facility');

        $prestations->whereHas('service', function ($query) use ($searchPartenaire) {
            $query->Where('name', 'like', '%' . $searchPartenaire . '%');
        });

        $prestations->whereHas('facility', function ($query) use ($searchPartenaire) {
            $query->Where('name', 'like', '%' . $searchPartenaire . '%');
        });

        $prestations->where('name', 'like', '%'.$search.'%')
            ->orderBy($orderBy, $orderDirection)
            ->simplePaginate(50);

        return $res = [
            'results' => $prestations,
            'total' => Prestation::all()->count(),
        ];

第一次创建Prestation $prestations = Prestation::with('service','facility')

然后应用条件,这是搜索中的好方法

【讨论】:

  • 感谢您的建议,我有一个问题:http请求的无限循环
  • @Tony 然后重新运行它。在我的项目中使用过它对我有用
【解决方案2】:

这是我在 Kamlesh Paul 建议后的代码:

$prestations = Prestation::with('service','facility');

        $prestations->whereHas('service', function ($query) use ($searchService) {
            $query->where('name', 'regexp', "/$searchService/i");
        });

        $prestations->whereHas('facility', function ($query) use ($searchPartenaire) {
            $query->where('name', 'regexp', "/$searchPartenaire/i");
        });

        $prestations->where('name', 'regexp', "/$search/i")
            ->orderBy($orderBy, $orderDirection)
            ->simplePaginate(50);

        $res = [
            'results' => $prestations,
            'total' => Prestation::all()->count(),
        ];

        return $res;

但是有一个无限的http请求调用,我认为问题是当哪里找不到相同的名称时,有人有建议吗? 谢谢。

【讨论】:

  • 你怎么知道发生了无限循环。?
  • 我在 devtools 中看到了这个(来自导航器),这不是一个循环,它是无限的请求调用。
【解决方案3】:

我终于找到了一个非常相似的解决方案:

$prestations = Prestation::with('service','facility')
            ->whereHas('service', function ($query) use ($searchService) {
            $query->where('name', 'regexp', "/$searchService/i");
            })  
            ->whereHas('facility', function ($query) use ($searchPartenaire) {
                $query->where('name', 'regexp', "/$searchPartenaire/i");
            })
                ->where('name', 'regexp', "/$search/i")
                ->orderBy($orderBy, $orderDirection)
                ->simplePaginate(50); 

        $res = [
            'results' => $prestations,
            'total' => Prestation::all()->count(),
        ];

感谢您的帮助。

【讨论】:

    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 2019-07-08
    • 2014-06-22
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2013-04-24
    • 2018-09-19
    相关资源
    最近更新 更多