2017-06-15 46 views
0

哪裏查詢對於我曾經在我的模型附加屬性,現在當我想要做where查詢自定義屬性,例如「類別」一些特殊的原因,我的臉與這個意思的錯誤無法找到與「類別」名稱列!把雄辯導致另一個表在做Laravel 5.4

爲了解決這個問題,我想如果我把我的查詢結果放到臨時表中,我可以做我想做的!

有人對此有任何想法嗎?如果它對我有用,我如何將結果傳輸到臨時表中?

回答

1

您將無法使用限制模型訪問的動態領域的數據庫中查詢,因爲那場很顯然,在數據庫中不存在。

但是,Collection對象具有相當強大的過濾功能,因此您可以在查詢數據庫後使用動態字段過濾Collection結果。這不像從數據庫中檢索結果之前過濾掉結果一樣,但是您可能會遇到這樣的情況:性能不是那麼重要,或者代碼清潔/維護成本超過性能成本。

作爲一個例子,給出以下型號:

class Book extends Model 
{ 
    public function getCategoryAttribute() 
    { 
     if ($this->targetAge < 13) { 
      return 'child'; 
     } 

     if ($this->targetAge < 18) { 
      return 'teen'; 
     } 

     return 'adult'; 
    } 
} 

下面的查詢將不能工作,因爲category領域實際上並不存在於表中:

$childrenBooks = Book::where('category', 'child')->get(); // error: no category field 

但是,以下將起作用,因爲您在從數據庫返回的模型集合上調用where(),並且模型可以訪問動態字段:

$childrenBooks = Book::get()->where('category', 'child'); 

這種情況下的問題是,雖然它可以工作,但它會從數據庫獲取所有書籍,併爲每個書籍創建一個Model實例,然後通過該完整Collection進行篩選。但是,好處是您無需複製訪問器方法中的邏輯。這是您需要權衡利弊的地方,並確定您的情況是否可以接受。

中間選擇是創建模型的範圍方法,讓您的訪問邏輯是隻在一個地方重複(如果它可以被複制的查詢):

class Book extends Model 
{ 
    public function getCategoryAttribute() 
    { 
     if ($this->targetAge < 13) { 
      return 'child'; 
     } 

     if ($this->targetAge < 18) { 
      return 'teen'; 
     } 

     return 'adult'; 
    } 

    public function scopeCategory($query, $category) 
    { 
     if ($category == 'child') { 
      return $query->where('target_age', '<', 13); 
     } 

     if ($category == 'teen') { 
      return $query->where(function ($query) { 
       return $query 
        ->where('target_age', '>=', 13) 
        ->where('target_age', '<', 18); 
      }); 
     } 

     return $query->where('target_age', '>=', 18); 
    } 
} 

然後你就可以使用這個查詢範圍,像這樣:

$childrenBooks = Book::category('child')->get(); 

的這裏的好處是邏輯應用到實際的查詢,所以他們從數據庫返回之前的記錄是有限的。主要的問題是現在你的「類別」邏輯是重複的,一次在訪問器中,一次在範圍內。此外,只有當您可以將訪問者邏輯轉換爲可由數據庫查詢處理的內容時,此功能纔有效。

+0

我投了你的答案,因爲包含了很多學習技巧,但我的問題沒有解決這個!謝謝。 –

+0

@BehnamAzimi你嘗試過什麼,什麼都不起作用? – patricus

+0

我想搜索每個頻道的類別並選擇具有我需要的類別的頻道。通過你的方式,我不能做我的類別的哪裏條款。我面臨「表中不存在類別列」的錯誤。所以我嘗試了很多東西,終於解決了我的問題!我將很快在[這個問題]中將其作爲答案(https://stackoverflow.com/questions/44582775/where-query-after-wherehas-not-work-as-it-should-in-laravel-5-4/44582967?noredirect = 1個#comment76158424_44582967)。 –