2017-08-04 282 views
0

我使用了一個scopeSearchLaravel scopeSearch雄辯

  • 我的模型:歷史

公共職能scopeSearch($查詢,$期)

$result = $query->where('user_id', 'like', '%' .$term. '%'); 
    return result; 

我使用了一個搜索欄在我的歷史視圖中,用戶可以輸入他們的ID,如果有與歷史相關的ID,它會顯示他們的歷史。

tables: 
'users' - columns: name, ... 
'histories' -columns: user_id, ... 

如果用戶搜索ID,我的範圍搜索將起作用。我希望用戶輸入名稱,而不是他們的ID,他們的歷史記錄將顯示。

的問題是,只有在user_ID的「歷史」

如何與這個雄辯的工作嗎?

我已經嘗試用修補程序輸入奇怪的東西,並通過獲取'用戶'中的所有數據修改scopeSearch函數中的一點,但它沒有工作。我在人際關係方面完全無力。對不起,如果我聽起來貪婪。

[更新]我建議使用一個連接方法,我正在嘗試它

+0

用戶登錄後使用此搜索?如果不是,你怎麼知道用戶是誰? – usrNotFound

+0

這是不必要的,這個scopeSearch只是根據用戶輸入的內容來過濾歷史。你是否建議使用身份驗證方法? – Explorace

回答

0

爲什麼不能簡單地移動範圍搜索到用戶模型?

因爲搜索查詢是基於用戶的表,你可以添加的歷史關係在用戶模式是這樣的:

public function histories(){ 
return $this->hasMany('App\History'); // depending on the namespace of the History model. 
} 

所以,在HistoryController,你可以可以把:

public function search($user_name){ 
$result = User::search($user_name)->with('histories')->get(); 
return $result; 
} 

或者如果你堅持用歷史的模型,只是定義了它的關係:

public function user(){ 
return $this->belongsTo('\App\User');} 

和範圍搜索功能:

public function scopeSearch($query, $term){ 
    return $query->whereHas('user', function($q) use($term){ 
     $q->where('name', 'like' , '%'.$term.'%'); 
    })->with('user')->get(); 
} 

注意:我不知道歷史和用戶表之間的關係的本質。我只是建議用戶有許多歷史記錄,而歷史記錄屬於用戶。如果不是這種情況,只要將模型中的關係類型改爲適當的。

希望能有所幫助。

+0

我試圖展示用戶的歷史,但讓我試試想 – Explorace

+0

試圖移動它,它不像你想象的那麼簡單,需要考慮用戶的關係...因爲我使用HistoryController來顯示那些歷史..仍然搞亂查詢和stucked .. – Explorace

+0

你的猜測是對的,我已經有: 用戶有很多歷史, 歷史屬於一個用戶。 您的複雜查詢運作良好。我從來沒有見過這樣的問題。在這之後,我會深入探討問題。 非常感謝,你已經完成了我的解決單一功能的2天。 – Explorace

0

那麼從您所提供的內容:

$result = $query->where('user_id', 'like', '%' .$term. '%'); 
return result; 

你總是會被搜索user_id,所以當然只有當有人輸入id時纔會返回。

看一看這裏閱讀有關查詢的範圍:

https://laravel.com/docs/5.0/eloquent#query-scopes

但它看起來像你需要像這樣在你的歷史模式:

public function scopeOfType($query, $type) 
{ 
    return $query->whereType($type); 
} 
+0

是的,現在它只適用於基於user_id的搜索。我想在歷史模型中訪問user-> name,但只有user_id,但是我迷路了 – Explorace

+0

謝謝你的鏈接,雖然scopeSearch是一個預定義的函數,但你讓我從惡夢中醒來。 – Explorace