[英]Laravel Eloquent - Array in a Nested Relation, how to assign it?
[英]Search on nested Array Laravel Eloquent
所以我構建了我的 API 並且我有一些數據,前端使這些數據可搜索。 我使用laravel eloquent從數據庫中獲取我的數據,並制作 HasMany Relation 並獲得 JSON 這樣的結果。 數據很好。
JSON
{
"ID": 444,
"MODULE_ID": 1112,
"MODULENAME": "Dashboard",
"submenu": [
{
"ID": 1052,
"MODULE_ID": 444,
"MODULENAME": "Map Monitoring",
},
{
"ID": 1053,
"MODULE_ID": 444,
"MODULENAME": "Map Status Terminal",
}
]
},
{
"ID": 445,
"MODULE_ID": 1112,
"MODULENAME": "Dummy",
"submenu": [
{
"ID": 1055,
"MODULE_ID": 445,
"MODULENAME": "Dolor",
},
{
"ID": 1056,
"MODULE_ID": 445,
"MODULENAME": "Lorem Ipsum",
}
]
}
submenu
關系數組上的嵌套數組是可搜索的。 問題是,我希望父數組和子數組都可以搜索。 如果我在 postman 中設置"search": "lorem"
body,結果應該是這樣的:
[
{
"ID": 445,
"MODULE_ID": 1112,
"MODULENAME": "Dummy",
"submenu": [
{
"ID": 1056,
"MODULE_ID": 445,
"MODULENAME": "Lorem Ipsum",
}
]
}
]
或者如果"search": "Dummy"
,所有數據Dummy
都會顯示,如下所示:
[
{
"ID": 445,
"MODULE_ID": 1112,
"MODULENAME": "Dummy",
"submenu": [
{
"ID": 1055,
"MODULE_ID": 445,
"MODULENAME": "Dolor",
},
{
"ID": 1056,
"MODULE_ID": 445,
"MODULENAME": "Lorem Ipsum",
}
]
}
]
我嘗試在我的 Controller 上轉換為 Laravel 集合,但它不起作用。 結果是一樣的:
$search = $request->search;
if(isset($search)) {
$data = collect($query)->filter(function($item) use ($search) {
return Str::startsWith($item->MODULENAME, $search);
});
}
我的查詢
$query = NavModule::where('VALIDSTATUS', 1)
->with(['submenu' => function($q) use ($request) {
$q->where('VALIDSTATUS', 1);
$q->select('ID', 'MODULE_ID', 'MODULENAME');
}])
->where('MODULETYPE', 'MAIN')
->where('LEVELNUMBER', 1)
->where('VALIDSTATUS', 1)
->select('ID', 'MODULE_ID', 'MODULENAME')
->orderBy('ORDERNUMBER', 'ASC')
->get();
$search = $request->search;
if(isset($search)) {
$data = collect($query)->filter(function($item) use ($search) {
return Str::startsWith($item->MODULENAME, $search);
});
}
$data = $query;
** 更新 **
我嘗試了@mrhn 選項,但這不是我想要的結果。
NavModule::whereHas('submenu', function ($query) use ($request) {
$query->where('MODULENAME', 'like', '%' . $request->search . '%')
})->with('submenu')
結果
[
{
"ID": 445,
"MODULE_ID": 1112,
"MODULENAME": "Dummy",
"submenu": [
{
"ID": 1055,
"MODULE_ID": 445,
"MODULENAME": "Dolor",
},
{
"ID": 1056,
"MODULE_ID": 445,
"MODULENAME": "Lorem Ipsum",
}
]
}
]
它只返回一個主數組,但返回所有嵌套數組數據。 我只想返回 1 個匹配數據。 我添加->with('submenu')
因為 Laravel 如果不添加它就不會返回關系數組。
我會感謝這個論壇的每一個答案和選項。 謝謝
2022 年 7 月 22 日更新
我假設您可以使用whereHas()
來實現您想要的。 此功能可以查詢關系,記得將您當前的查詢添加到我的示例中。
NavModule::whereHas('submenu', function ($query) use ($request) {
$query->where('MODULENAME', 'like', '%' . $request->search . '%')
})
您可以在關系方法上使用 where 條件,您可以像下面的代碼一樣使用
在您的菜單模型中
public function subMenus():HasMany
{
return $this->hasMany(SubMenu::class)->where('condition_key','condition_value')
}
//using
Menus::with('subMenus')->get();
或者你可以更多 where 方法
Menus::with(['subMenus'=>fn($q)=>$q->where('condition_field','condition_value')
->where('fo','bar'))->get();
例如,您可以根據狀態創建更多方法
public function subMenusWithfoo():HasMany
{
return $this->hasMany(SubMenu::class)
->where('condition_key','condition_value')
->where('bar','foo');
}
//using
Menu::with('subMenusWithfoo')->get();
謝謝大家的回答和評論。 我已經解決了這個問題。 這是我的代碼:
Controller
////////////////////
NavModule::where(fn ($query) =>
$query->where('MODULENAME', 'like', '%' . $request->search . '%')
->where('VALIDSTATUS', '1')
->orderBy('ORDERNUMBER', 'ASC')
->orWhereHas(
'submenu', fn ($subquery) =>
$subquery
->where('MODULENAME', 'LIKE', '%' . $request->search . '%')
)
)
->with('submenu')
->where('MODULETYPE', 'MAIN')
->where('LEVELNUMBER', 1)
->where('VALIDSTATUS', 1)
->select('ID', 'MODULE_ID', 'MODULENAME')
->orderBy('ORDERNUMBER', 'ASC')
->get();
//////////////// Rest of code
Model
public function submenu()
{
$search = request('search') ? : "";
return $this->hasMany(NavModuleSub::class, 'MODULE_ID','ID')->where('MODULENAME', 'LIKE', '%' . $search . '%');
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.