在 laravel 中筛选两个相关模型
Filter in two related model in laravel
我有两个模型,分别命名为 Product
和 Category
。在产品 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();
我有两个模型,分别命名为 Product
和 Category
。在产品 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();