laravel 如何获取所有(父)数据并加载其子数据(渴望加载),但父列上有条件?

7gcisfzg  于 2023-10-22  发布在  其他
关注(0)|答案(3)|浏览(108)

假设我只想在user.status为true时获取所有用户及其帖子。
如何实现这一点使用渴望加载(即与)
我想得到的数据:

{
"users": [
    {
        "id": 1,
        "status": false
    },
    {
        "id": 2,
        "status": false
    },
    {
        "id": 3,
        "status": true,
        "posts": [
            {
                "id": 1,
                "comment": "abc"
            },
            {
                "id": 2,
                "comment": "abc"
            },
            {
                "id": 3,
                "comment": "abc"
            }
        ]
    }
]

}

2fjabf4q

2fjabf4q1#

通过加载所有用户,然后筛选想要加载的用户,最后即时加载它们的关系,可以轻松地实现这一点。

$users = User::all();
$users->filter->status->load('posts');
vohkndzv

vohkndzv2#

如果你正在使用一个相当现代的Laravel版本,你可能想看看API资源上的文档:
https://laravel.com/docs/7.x/eloquent-resources

条件关系文档

试试这样的方法:

/**
 * Transform the resource into an array.
 *
 * @param  \Illuminate\Http\Request  $request
 * @return array
 */
public function toArray($request)
{
    return [
        ...
        'posts' => $this->when((bool) $this->status, PostResource::collection($this->whenLoaded('posts'))),
        ...
    ];
}
hpxqektj

hpxqektj3#

我遇到了一个类似的问题,我需要使用with方法来加载相关数据,但我也想进一步过滤它,比如使用where方法。不幸的是,with方法不直接支持这种过滤。
所以,我必须说,解决办法有点棘手。要解决此限制,可以在模型中使用selectRaw方法创建自定义别名,并使用此别名建立所需的关系。
在您的特定场景中,您可以尝试以下代码:

User::selectRaw('users.*, IF(status = FALSE, null, id) as idx')->with('post')->get()

这段代码创建了一个名为idx的别名。如果用户的statusFALSE,则将idx设置为null,否则使用id
接下来,您可以在User模型中像这样定义关系:

public function post(){
    return $this->hasMany(Comment::class, 'user_id', 'idx');
}

这意味着,如果users.status is FALSEidx将是null。另一方面,如果users.status is TRUEidx将具有id的值。因此,对comments表的后续查询将使用idx作为相关键。

相关问题