英文:
Counting data before sending to view in Laravel
问题
我有两张表,products(产品)和product_images(产品图片),现在我想显示至少有一张图片的产品。
在控制器中,我有一个简单的函数在ProductController中来获取所有的产品:
public function products(){
$allProducts = $this->product->paginate(15);
return view('frontend.pages.products',compact('allProducts'));
}
但是,我想要发送至少有一个图片的每个产品。
我应该怎么做才能实现这个目标?
编辑:
我已经在这两张表之间创建了关联,现在我该如何获得我想要的答案?
我在控制器中写了以下代码:
$allProducts = $this->product->whereHas('product_images', function ($query){
$query->where();
})->get();
英文:
I have two tables, products and product_images, now I want to show product which has at least one image.
In controller I have a simple function in ProductController to fetch all the products:
public function products(){
$allProducts = $this->product->paginate(15);
return view('frontend.pages.products',compact('allProducts'));
}
But, I want to send the products which has at least one image of each product.
What should I do to achieve that?
Edit:
I have created relationship between tables, now how can I get my desired answer?
I have written this in the Controller:
$allProducts = $this->product->whereHas('product_images', function ($query){
$query->where();
})->get();
答案1
得分: 0
Eloquent已经内置了这个功能。
示例
// 检索所有具有三个或更多评论的帖子...
$posts = App\Post::has('comments', '>=', 3)->get();
在你的情况下
在你的情况下,你可以将$allProducts
行更改为
$allProducts = $this->product()->has('product_image', '>=', 1)->paginate(15);
我没有测试上面的代码。
有关此主题的更多信息,请参阅文档。
https://laravel.com/docs/6.x/eloquent-relationships#querying-relationship-existence
英文:
Eloquent has this built in.
Example
// Retrieve all posts that have three or more comments...
$posts = App\Post::has('comments', '>=', 3)->get();
In your case
In your case you could change the $allProducts
line to be
$allProducts = $this->product()->has('product_image', '>=', 1)->paginate(15);
I didn't test the code above.
See documentation for more information on this topic.
https://laravel.com/docs/6.x/eloquent-relationships#querying-relationship-existence
答案2
得分: 0
假设表结构为
产品
-id
-名称
产品图片
-id
-产品_id
-网址 //您所需的任何列
$product_ids = DB::table('product')
->join('product_image','product_image.product_id','=','product.id')
->select('product.id','product.name')
->groupBy('product.id')
->get();
$product_count = count($product_ids);
英文:
Assuming table schema
product
-id
-name
product_image
-id
-product_id
-url //any columns you needed
$product_ids = DB::table('product')
->join('product_image','product_image.product_id','=','product.id')
->select('product.id','roduct.name')
->groupBy('product.id')
->get();
$product_count = count($product_ids);
答案3
得分: 0
你可以使用selectRaw:
$products = Product::leftJoin('product_images', function ($join) {
$join->on('products.product_id', '=', 'product_images.product_id');
})->selectRaw("products.product_id i, count(product_images.id) c")
->groupBy('products.product_id')
->where('c', '>', 3)
->get();
英文:
You can use selectRaw:
$products = Product::leftJoin('product_images',function ($join){
$join->on('products.product_id','=','product_images.product_id');
})->selectRaw("products.product_id i, count(product_images.id) c")
->groupBy('products.product_id')
->where('c','>=',3)
->get();
答案4
得分: 0
获取答案查询关系:
查询将如下所示:
$allProducts = $this->product->has('Images')->paginate(15);
但是,请确保您在模型中创建了以下关系:
public function Images(){
return $this->hasMany('\App\Models\ProductImages');
}
我使用了hasMany关系,因为一个产品可以有多个图像。
英文:
Getting answer querying realtionship:
The query will look like following:
$allProducts = $this->product->has('Images')->paginate(15);
But, make you sure you have created relation in Model like the following:
public function Images(){
return $this->hasMany('\App\Models\ProductImages');
}
I have used hasMany relationship because one product can have multiple images.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论