【问题标题】:Laravel with() eager loading returning empty dataLaravel with() 急切加载返回空数据
【发布时间】:2022-01-10 07:49:08
【问题描述】:

我的模型中有一对多的关系。基本上是CategoryProduct。一个产品只能有一个类别,但一个类别可以有多个产品。下面的代码有效:

return Category::select('id', 'name')->whereIn('id', $categories)->with('products')->get();

它返回一个产品密钥,其中包含数据库中的产品列,但是当我使用急切加载时,它只返回一个空集:

return Category::select('id', 'name')->whereIn('id', $categories)->with(['products' => function($query){
            $query->limit(5);
        }])->get();

我也尝试过像 return $query->limit(5); 这样添加 return 关键字,但仍然没有成功。

我也尝试过像这样指定列:

return Category::select('id', 'name')->whereIn('id', $categories)->with('products:id,name')->get();

但它仍然返回一个空数据集。

由于我正在构建 API,因此 JSON 数据如下所示:

[
     {
        "id": 161,
        "name": "Health & Personal Care",
        "products": []
    },
    {
        "id": 256,
        "name": "Makeup & Fragrances",
        "products": []
    },
]

我的表结构:

categories (there's no product_id column, since it's one to many)
+----+------+
| id | name |
+----+------+
|    |      |
+----+------+
|    |      |
+----+------+
|    |      |
+----+------+

product
+----+------+-------+-------------+
| id | name | price | category_id |
+----+------+-------+-------------+
|    |      |       |             |
+----+------+-------+-------------+
|    |      |       |             |
+----+------+-------+-------------+
|    |      |       |             |
+----+------+-------+-------------+

我的类别模型是这样声明的:

public function products()
{
    return $this->hasMany(Product::class);
}

产品型号为:

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

【问题讨论】:

  • 你检查过关系的定义是否正确
  • @rubys 我会在上面的表格中添加
  • 只需尝试简单查询而不选择特定列 Category::whereIn('id', $categories)->with('products')->get();
  • @BhargavRangani 但我想选择列并且每个类别只显示 5 个项目。

标签: laravel eloquent eager-loading


【解决方案1】:

您正在尝试限制加载的关系,而不是查询,您可以使用 eloquent-eager-limit 执行此操作

安装它:

composer require staudenmeir/eloquent-eager-limit:"^1.0"

然后在类别模型中:

class Category extends Model
{
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
.....
public function products()
{
return $this->hasMany(Product::class, 'product_id');
}

public function lastFiveProducts()
{
return $this->hasMany(Product::class, 'product_id')
->latest()->limit(5);
}
    }

在产品中:

class Product extends Model
{
use \Staudenmeir\EloquentEagerLimit\HasEagerLimit;
......
}

现在这个查询将得到预期的结果:

return Category::select('id', 'name')->whereIn('id', $categories)->with(['products' => function($query){
            $query->limit(5);
        }])->get();

或使用新的关系:

  return Category::select('id', 'name')->whereIn('id', $categories)->with(['lastFiveProducts'])->get();

还请注意,当您使用 ->with('products:id,name') 加载与特定列的关系时,您始终应该加载外键 ->with('products:id,name,category_id')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-12
    • 2020-10-23
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 2014-08-13
    相关资源
    最近更新 更多