我被如何解决这个问题所困扰,我在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();
在这里记录
你可以做两件事:
-
使用laravel内置的
toArray()
方法返回数组中的值,然后使用phparray_filter()
函数删除空值 -
您可以创建一个
collection
并使用laravel内置的filter()
函数从数据收集中删除空值