【问题标题】:Counting data before sending to view in Laravel在发送到 Laravel 中查看之前计算数据
【发布时间】:2020-01-03 11:11:13
【问题描述】:

我有两张表,products 和 product_images,现在我想展示至少有一张图片的产品。

在控制器中,我在 ProductController 中有一个简单的函数来获取所有产品:

public function products(){
    $allProducts = $this->product->paginate(15);
    return view('frontend.pages.products',compact('allProducts'));
}

但是,我想发送每个产品至少有一张图片的产品。

我应该怎么做才能做到这一点?

编辑:

我已经创建了表之间的关系,现在我怎样才能得到我想要的答案?

我已经在Controller中写了这个:

$allProducts = $this->product->whereHas('product_images', function ($query){
        $query->where();
    })->get();

【问题讨论】:

  • 如果您使用关系,那么使用whereHascount() 即可。
  • 我没有使用关系。只有关系才有可能吗?
  • 你能显示两个表的架构吗?

标签: laravel controller


【解决方案1】:

假设表模式

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

【讨论】:

  • 我们如何编写查询来获取有图片的产品?我已经编辑了我的问题。
  • Deshmukh 您的代码运行良好,但您能否补充一下我们如何获得关系?
  • @Alisha 点击此链接链接,该链接解释了关系的详细信息。 laravel.com/docs/5.8/eloquent-relationships
【解决方案2】:

Eloquent 内置了这个功能。

示例

// Retrieve all posts that have three or more comments...
$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

【讨论】:

  • 上面的代码说:Method App\Http\Controllers\FrontController::product does not exist.
  • 抱歉,$this->product 最初指向的是什么?您需要在此处引用您的 Eloquent 模型。
【解决方案3】:

您可以使用 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】:

    查询关系得到答案:

    查询将如下所示:

    $allProducts = $this->product->has('Images')->paginate(15);
    

    但是,请确保您已在 Model 中创建了如下所示的关系:

    public function Images(){
        return $this->hasMany('\App\Models\ProductImages');
    }
    

    我使用了 hasMany 关系,因为一个产品可以有多个图像。

    【讨论】:

      猜你喜欢
      • 2021-01-30
      • 2021-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-10
      • 1970-01-01
      • 1970-01-01
      • 2021-08-24
      相关资源
      最近更新 更多