Laravel with() 急切加载返回空数据

Posted

技术标签:

【中文标题】Laravel with() 急切加载返回空数据【英文标题】:Laravel with() eager loading returning empty data 【发布时间】: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 个项目。 【参考方案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')

【讨论】:

以上是关于Laravel with() 急切加载返回空数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 laravel 急切加载选择特定列不起作用

Laravel 急切加载特定列错误

Laravel 5.1通过急切加载返回连接字段

在 laravel 中分页急切加载

Laravel 在急切加载时使用 Eloquent 选择特定列

Laravel 5.4 - 如何对急切加载关系进行分页