gpt4 book ai didi

Laravel Eloquent 嵌套查询

转载 作者:行者123 更新时间:2023-12-04 20:00:43 25 4
gpt4 key购买 nike

我在与 Laravel 合作时陷入了困境。我有以下型号:

  • 分类
  • 产品
  • 分类产品
  • CategoryProduct保存有关哪个产品属于哪个类别的信息(一个产品可能属于多个类别)。

    现在,当我想加载属于特定类别的所有产品时,我需要在 Product 上运行查询。和 CategoryProduct这就是我被卡住的地方。

    我进行了以下尝试,但没有成功:
    $products = Product::where('status', '=', 'active')
    ->where('category_id', '=', $category_id)
    ->take($count)
    ->skip($skip)
    ->get();

    显然,它会说 category_id不是列。

    这是我的数据库和模型结构:

    类别表

    ID,
    姓名,
    等等。

    产品表

    ID,
    姓名,
    单品,
    等等。

    category_products 表

    ID,
    product_id, (Product.id 的外键)
    category_id, ( Category.id 的外键)
    等等。

    产品型号
    class Product extends Eloquent {

    protected $table = 'products';

    protected $hidden = array();

    public static $rules = array('name' => 'required|min:3');

    }

    分类型号

    class Category extends Eloquent {

    protected $table = 'categories';

    public static $rules = array('name' => 'required|min:3');

    }

    分类产品型号
    <?php

    class CategoryProduct extends Eloquent {

    protected $table = 'category_products';

    public function product()
    {
    return $this->belongsTo('Product');
    }

    public function category()
    {
    return $this->belongsTo('Category');
    }
    }

    更新

    关于这个的新问题

    我正在尝试展示产品。如果没有通过类别(值为-1),那么我将显示所有产品,否则我将显示通过类别中的产品。

    现在,当我展示所有产品时,这些产品可能已经存在于一个类别中。我想为已经在一个类别中的产品显示勾选的复选框。我正在做这样的事情:
    if($category_id==-1)
    $products = Product::where('status', '=', 'active')->take($count)->skip($skip)->get();
    else{
    $products = Product::whereHas('categories', function($q) use ($category_id)
    {
    $q->where('category_id', $category_id);
    })->where('status', 'active')
    ->take($count)
    ->skip($skip)
    ->get();
    }

    category_products 将 product_id, category_id 作为列。

    现在,查询:

    $products = Product::where('status', '=', 'active')->take($count)->skip($skip)->get();

    只会从 中挑选产品产品 table 。如果我在 中检查每个产品是否存在category_products ,那么大量的产品就会有太多的数据库查询。

    任何想法,如何实现这一目标。我希望我能够清除我的情况。谢谢

    最佳答案

    CategoryProduct除非您有指向其他关系的 product_id 和 category_id 之外的其他字段,否则不需要模型。

    需要的是在Category上建立关系的方法。和 Product楷模。

    Category , 添加关系函数...

    public function products()
    {
    return $this->belongsToMany('Product', 'category_products');
    }

    在您的 Product模型,对类别执行相同的操作。

    public function categories()
    {
    return $this->belongsToMany('Category', 'category_products');
    }

    然后,您可以使用您的关系方法和 whereHas() 查询属于该类别的活跃产品。

    $products = Product::whereHas('categories', function($q) use ($category_id)
    {
    $q->where('id', $category_id);
    })->where('status', 'active')
    ->take($count)
    ->skip($skip)
    ->get();

    关于Laravel Eloquent 嵌套查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29751104/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com