如何过滤laravel模型关系,如果关系为空/null,则不应显示对象



我被如何解决这个问题所困扰,我在laravel中,模型关系的结果返回空/null关系字段,当我只想显示"动物"在使用搜索字符串执行GET调用时使用数据。例如,在下面的"favorite_animals"我只想要"动物"。对象,其中包含要在数组中显示的数据。

这是端点localhost/api/v1/lists/2?搜索= honeybadger

"name": "titleTwo",
"description": "list two",
"favorite_animals": [
{
"animals": null
},
{
"animals": {
"id": 1,
"name": "HoneyBadger",
"description": "dgaf",
"created_at": "2021-07-30T22:49:36.000000Z",
"updated_at": "2021-07-30T22:49:36.000000Z"
}
},
{
"animals": null
}
]

控制器中查询模型数据的代码块如下:

$list = UsersAnimalList::with(['favoriteAnimals.animals' => function($query) use($request){
$query->where('name', 'like', $request->input('search'));}])->get();

模型关系如下:

模型:UserAnimalList

public function favoriteAnimals(){
return $this->hasMany(UsersFavoriteAnimals::class, 'list_id', 'id');}

模型:UsersFavoriteAnimals

public function animals(){
return $this->hasOne(Animals::class, "id", "animals_id");}

其他模型,但没有关系方法:动物

我试过使用has(),但返回一个空响应。我试过将关系从hasMany()更改为hasOne(),它只从显示空数组更改为null;

我还尝试使用where()来过滤掉null生成的关系字段"animals"但是我得到错误说字段不存在。

您还可以根据关系存在性筛选模型:

$list = UsersAnimalList::with(['favoriteAnimals.animals' => function($query) use($request) {
$query->where('name', 'like', $request->input('search'));
}])->has('favoriteAnimals.animals')->get();

在这里记录

你可以做两件事:

  1. 使用laravel内置的toArray()方法返回数组中的值,然后使用phparray_filter()函数删除空值

  2. 您可以创建一个collection并使用laravel内置的filter()函数从数据收集中删除空值

相关内容

  • 没有找到相关文章

最新更新