在laravel中的两个相关模型中过滤

Posted

技术标签:

【中文标题】在laravel中的两个相关模型中过滤【英文标题】:Filter in two related model in laravel 【发布时间】:2021-09-04 19:48:17 【问题描述】:

我有两个模型,分别命名为 ProductCategory。在产品表中,我将 category_id 作为类别的外键。两个表都有title 列。我想搜索标题,当它与类别表相关时,该类别的所有产品都会出现在结果中,但是当它与产品表相关时,只有那些与查询相关的产品才会出现。

我试过了:

$query = Category::with('products')->select(['products.*']);

if($request->get('q'))
    $query->where(function($query1) use ($request)
        $query1->where('categories.title', 'like', '%'.$request->get('q').'%')
        ->orWhere('products.title', 'like', '%'.$request->get('q').'%');
    );

            

【问题讨论】:

【参考方案1】:

我认为你可以不用左连接

 $result=Category::when($request->get('q'),function ($query)use($request)

        $query->where('title', 'like', '%'.$request->get('q').'%');
    )
        ->when($request->get('q'),function ($query)use($request)

            $query->orWhereHas('categories',function ($q)use($request)

            $q->where('title', 'like', '%'.$request->get('q').'%');

        );
    )->get();

【讨论】:

【参考方案2】:

感谢家伙的努力,但我使用加入解决了这个问题。对于发现此解决方案有帮助的其他人,我不会删除此问题。 所以这是我尝试过的代码。

$query = Product::leftJoin('categories',function($join)
    $join->on('products.category_id','=','categories.id');
)->select(['products.*']);

if($request->get('q'))
    $query->where(function($query1) use ($request)
        $query1->where('categories.title', 'like', '%'.$request->get('q').'%')
        ->orWhere('products.title', 'like', '%'.$request->get('q').'%');
    );


$query->get();

【讨论】:

【参考方案3】:

您可以同时搜索这两个标题,当它与类别表相关时,该类别的所有产品将如下所示:

SELECT `title` FROM `PRODUCTS` WHERE `product`.`category_id` = some id ;

在laravel中代表产品型号:

Product::select('title')->where(['category_id', 1 ])->get();

如果您想搜索类别然后代表该类别的产品,您可以这样做:

$categoryData = Category::select('id')->where(['title', 'LIKE', '%abc%'])->get();
$productData = Product::select('title')->where(['category_id', $categoryData->id ])->get();

【讨论】:

以上是关于在laravel中的两个相关模型中过滤的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 中自动删除相关行(Eloquent ORM)

如何在 Laravel Eloquent 上过滤相关模型

Laravel - 按“字段及其关系模型字段”之间的条件过滤模型

如何通过多对多关系获取与同一张表相关的行 - Laravel

Laravel Eloquent - 从相关模型中检索特定列

在Laravel中创建记录后发送通知