在 laravel 中筛选两个相关模型

Filter in two related model in laravel

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

我试过了:

$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').'%');
    });
}
            

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

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();

感谢大家的努力,但我使用 join 解决了这个问题。我不会为其他认为此解决方案有帮助的人删除此问题。 所以这是我尝试过的代码。

$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();

我想你可以不用左连接

 $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();