[英]laravel join and where condition on two tables with pagination
產品
+--------------+--------------+
| id | name | description |
+--------------+--------------+
| 1 | shirt | some desc |
| 2 | shirt_b| some desc |
| 3 | shoe | some desc |
| 4 | shirt_c| some desc |
+--------------+--------------+
Product_metas
--------------+---------+--------+
| product_id | color | price |
--------------+---------+--------+
| 1 | black | 2000 |
| 1 | red | 6000 |
| 1 | brown | 8000 |
| 2 | black | 6000 |
| 2 | green | 4000 |
| 3 | blue | 7000 |
| 4 | red | 9000 |
| 4 | blue | 2000 |
| 4 | black | 8000 |
--------------+--------+---------+
用戶想用這樣的產品名稱和價格范圍進行搜索:
關鍵字:“襯衫”,最低價格:“5000”,最高價格:“10000”
[
0 : [
Name : shirt
Desc : some desc
metas [
0 : [red , 6000],
1 : [brown , 8000],
]
],
1 : [
Name : shirt_b
Desc : some desc
metas [
0 : [black , 6000],
]
],
2 : [
Name : shirt_c
Desc : some desc
metas [
0 : [red , 9000],
1 : [black , 8000],
]
],
]
$products = Product::where('name', 'like', '%' . $request->input('keyword') . '%')
->whereHas('metas', function($query) use ($request) {
$query->whereBetween('price', [
$request->input('price_min'),
$request->input('price_max')
]);
})
->paginate(10);
return view('/home' , compact(['products']));
<div>
{!! $products->render() !!}
@forelse($products as $product)
<ul>
<li><strong>Name : </strong>{{ $product->name }}</li>
<li><strong>Desc : </strong>{{ $product->desc }}</li>
<ul>
@forelse($product->metas()->get() as $meta)
<li><strong>Color : </strong>{{ $meta->color }}<strong> --> $ </strong>{{ $meta->price }}</li>
@empty
<h3>no meta</h3>
@endforelse
</ul>
</ul>
@empty
<h3>no data</h3>
@endforelse
</div>
我應該如何在控制器中查詢並使用分頁顯示它們?
正如評論中所說, whereHas
只是根據回調過濾結果。 但其余的評論是錯誤的。 要包含另一個表中的值,請使用with
和whereHas
,而不是代替 it。
$products = Product::where('name', 'like', '%' . $request->keyword . '%')
->whereHas('metas', function($query) use ($request) {
$query->whereBetween('price', [$request->price_min, $request->price_max]);
})
->with('metas')
->paginate(10);
return view('/home' , compact('products'));
假設您的Product
和Meta
模型具有適當的關系,這將生成以下 SQL 查詢,返回您想要的結果:
select * from `products` where `name` like '%shirt%' and exists (select * from `product_metas` where `products`.`id` = `product_metas`.`product_id` and `price` between 5000 and 1000);
select * from `product_metas` where `product_metas`.`product_id` in (1, 2, 4)
它運行兩個查詢並不理想,但那是 Laravel。
在您的布局中,無需使用關系方法。 只需使用該屬性:
@forelse($product->metas as $meta)
定義模型和關系。 在產品型號中:
public function metas(){
return $this->hasMany('ProductMetas');
}
然后
$products = Products::with('metas')->where('name',$name)->where('price','=>', $LB)->where('price','<=',$UB)->simplePaginate(15);
return View::make('view.name', compact('products'));
請記住從輸入中獲取名稱和價格范圍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.