2013-10-28 11 views
4

這可能是一個騙局,但我一直在拖網尋找適當的答案,並且還沒有找到。Laravel 4 - 在構建集合時附加where子句到關係的雄辯方法

所以基本上我想要做的就是連接兩個表,並根據連接表中的字段將where條件附加到整個集合。

所以可以說我有兩個表:

users: 
    -id 
    -name 
    -email 
    -password 
    -etc 

user_addresses: 
    -address_line1 
    -address_line2 
    -town 
    -city 
    -etc 

對於參數的緣故(意識到這可能不是最好的例子) - 讓我們假設一個用戶可以有多個地址條目。現在,laravel /雄辯給了我們一個以範圍的形式包含集合條件的好方法,所以我們將使用其中的一個來定義過濾器。

所以,如果我想獲得的所有用戶,在超人的地址,我可以按如下方式創建一個範圍和關係:

Users.php(模型)

class users extends Eloquent{ 
    public function addresses(){ 
     return $this->belongsToMany('Address'); 
    } 

    public function scopeSmallvilleResidents($query){ 
     return $query->join('user_addresses', function($join) { 
        $join->on('user.id', '=', 'user_addresses.user_id'); 
       })->where('user_addresses.town', '=', 'Smallville'); 
    } 
} 

這但它有點醜陋,它弄亂了我雄辯的對象,因爲我不再有一個很好的包含用戶地址的動態屬性,所有東西都擠在用戶對象中。

我曾嘗試過各種其他的事情來得到這個使用上的關係的關閉工作,例如看起來前途無量:

//這只是在過濾器的連接關係,從而將顯示所有用戶,但只點在它在所有

User::with('Addresses')->where('user_addresses.town', '=', 'Smallville'); 

User::with(array('Addresses' => function($query){ 
       $query->where('town', '=', 'Smallville'); 
      })); 

//這不工作相匹配的地址拉那麼,有沒有運用WH的「雄辯」的方式以過濾主要集合並保持我的雄辯對象機智的方式創建關係的子句?還是我喜歡這麼多人被優雅的雄辯語法所破壞,以至於我問得太多了?

注意:我知道你通常可以通過定義其他方向的關係(例如首先訪問地址表)來解決這個問題,但這並不總是理想的,也不是我所要求的。

在此先感謝您的幫助。

+1

顯然,它的工作原理就像你說的,這可能是脫離主題的,但是在設置'addresses()'關係時不應該使用'hasMany()'而不是'belongsToMany()'? – user1669496

+0

是的,它應該 - 你的先生! – WebweaverD

回答

2

在這一點上,您無法根據相關模型中的約束來過濾主模型。 這意味着,只有一個滑動條,你不能只有Users誰擁有user_address.town = 'Smallwille'

就我個人而言,我希望這會很快實施,因爲我可以看到很多人要求(包括我自己在內)。

目前的解決方法是凌亂的,但它的工作原理:

$products = array(); 
$categories = Category::where('type', 'fruit')->get(); 
foreach($categories as $category) 
{ 
$products = array_merge($products, $category->products); 
} 
return $products; 
+0

如果產品是對象,array_merge是否會工作?我不得不首先通過toArray()運行結果嗎?您是否知道我可以關注的更優雅解決方案的功能要求? – WebweaverD

+0

我認爲它會工作,但無論如何調用toArray()肯定會加快速度,所以它應該是一件好事。我記得Taylor在github上爲'has()'方法討論了這樣的事情,因爲它目前僅支持按對象計數進行過濾。他的回答是,他將致力於此並解決問題。所以我的猜測是,將來我們可以編寫類似'$ products = Product :: has('Category',function($ query){$ query-> where('type','fruit');}) - > get();' –

+0

感謝您的幫助 - 不是我想要的答案,但至少我可以停止拖網Google。我想我們必須等待泰勒......我不認爲任何人都有這麼做的機會與拉請求。 – WebweaverD

1

如問題提到有一個辦法,首先篩選不會忽略,然後使用預先加載來加載相關用戶對象。像這樣:

模型當然

$addressFilter = Addresses::with('Users')->where('town', $keyword)->first(); $users= $addressFilter->users;

綁定屬於關聯。

/// *而如果有人想讀書也使用預過濾,用戶的數據可以傳遞一個封閉的「與」

$usersFilter = Addresses::with(array('Users' => function($query) use ($keyword){ 
     $query->where('somefield', $keyword); 
    }))->where('town', $keyword)->first(); 
$myUsers = $usersFilter->users;