【问题标题】:Querying Relationship Existence, how to add conditions depending on an array length查询关系存在,如何根据数组长度添加条件
【发布时间】:2018-10-24 07:19:54
【问题描述】:

我想通过存储在单独的表(在本例中为 tapps)中的某些特征来过滤项目(在本例中为 pubs),并且两者都由 pub_tapps 关联。

我有以下表格:pubs、tapps、pub_tapps(pub_id,tapp_id)

Pub 和 Tapp 的关系如下:

 public function pubTapps()
{
    return $this->belongsToMany(Tapp::class, 'pub_tapps');
}

在我的 Pub 模型中,我尝试对数组 $request=[5,8, 7] 进行以下测试:

public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
    $tapps_chosen = $request->get('tapps');

    $tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;

    return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
        $query->where('tapp_id', $tapps_chosen[0]);
    })
        ->whereHas('pubTapps', function($query) use($tapps_chosen) {
            $query->where('tapp_id', $tapps_chosen[1]);
        })
        ->whereHas('pubTapps', function($query) use($tapps_chosen) {
            $query->where('tapp_id', $tapps_chosen[2]);
        })
        ->get();
}

这是完美的工作,但对于给定的 3 维数组...

如何处理一个 n 长度的数组??

我试过了,但根本不起作用(返回一个空数组):

return $pubs = Pub::whereHas('pubTapps', function ($query) use 
     ($tapps_chosen) {

        foreach ($tapps_chosen as $tappId) {
            $query->where('tapp_id', $tappId);
      }
       })->get();

我该怎么办???有什么想法让它发挥作用吗??

非常感谢!

【问题讨论】:

  • dd($tapps_chosen);return Pub:: 之前的结果是什么?
  • [5,8, 7],在我使用的测试用例中(我选择 tapp_id= 5, 7 和 8)。我用这个 $tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen; 因为 Swagger

标签: php laravel subquery filtering has-many


【解决方案1】:

这个怎么样?

public function pubsFilteredByTapps(FilteredTappsPubsRequest $request)
{
    $tapps_chosen = $request->get('tapps');

    $tapps_chosen = is_string($tapps_chosen) ? explode(',', str_replace('"', '', $tapps_chosen)) : $tapps_chosen;

    return Pub::whereHas('pubTapps', function($query) use($tapps_chosen) {
        $query->whereIn('tapp_id', explode(',' $tapps_chosen));
    })->get();
}

这样,如果你的数组中有任意数量的 ID,eloquent 会生成一个带有 IN 子句的请求,你会得到一个正确的结果。

【讨论】:

  • 非常感谢您的回答,我的朋友,但 Jonas 解决方案给了我使用 foreach 寻找的结果。再次感谢!!!
【解决方案2】:

使用这个:

$query = Pub::query();
foreach ($tapps_chosen as $tappId) {
    $query->whereHas('pubTapps', function($query) use($tappId) {
        $query->where('tapp_id', $tappId);
    });
}
return $query->get();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2023-03-31
    • 2017-07-16
    • 1970-01-01
    • 2021-11-29
    • 2023-01-09
    • 1970-01-01
    相关资源
    最近更新 更多