簡體   English   中英

Laravel雄辯-使用語句過濾子查詢

[英]Laravel eloquent - Filtering subquery inside with statement

我有以下查詢:

 $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
 $query->where('cities.name', '=', 'This is a city name');
 }))->first();

讓我們來看一個例子:我有三個表, CountryCityCityDetails 我想獲得所有國家/地區,然后得到所有城市(包括詳細信息),但我也想按名稱過濾城市獲取屬於城市表的詳細信息表

如果我想使用with來使用with(cities.details)來獲取子級和另一個表,如何使用CITIES屬性進行過濾?

主要問題是:如何在with語句(如secondTable.OtherTable獲取兩個表,並使用secondTable屬性過濾查詢?

為了更清楚一點,如果我使用如下語句:

  $countries = Country::where('code', '=', $code)
 ->with(array('cities.details' => function ($query) use ($user) {
    $query->where('name', '=', 'This is a detail name');
    }))->first();

我只能訪問詳細信息表屬性。 問題是:如何使用語句訪問城市表屬性以進行過濾?

提前致謝

我剛剛找到了解決方案。 基本上,我應該為城市表應用過濾器,然后在子查詢上調用wit函數。 這段代碼解決了我的問題:

    $countries = Country::where('code', '=', $code)
 ->with(array('cities' => function ($query) use ($user) {
    $query->where('name', '=', 'San Francisco')->with('details');
    }))->first();

請注意,僅在子查詢中過濾后,我才在城市調用with('details')

最簡單的一種是使用聯接查詢:

(new Country)
    ->join('cities', 'cities.id', '=', 'countries.city_id')
    ->join('city_details', 'cities.id', '=', 'city_details.city_id')
    ->where('cities.name', 'TheName')
    ->where('city_details.info', 'info')
    ->select('...');

但是結果只有一個層次。 所以,

$query = (new Models\Country())
    ->with([
        'cities' => function ($query) {
            $query->where('name', 'xxx')->with([
                'details' => function ($query) {
                    $query->where('info', 'info');
                }
            ]);
        }
    ]);

$result = $query->get()->filter(function ($item) {
    return count($item['cities']);
});

結果給出了空城市的國家。 因此,最后使用Laravel集合進行過濾。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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