簡體   English   中英

搜索嵌套數組 Laravel Eloquent

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM