哪裏查詢對於我曾經在我的模型附加屬性,現在當我想要做where
查詢自定義屬性,例如「類別」一些特殊的原因,我的臉與這個意思的錯誤無法找到與「類別」名稱列!把雄辯導致另一個表在做Laravel 5.4
爲了解決這個問題,我想如果我把我的查詢結果放到臨時表中,我可以做我想做的!
有人對此有任何想法嗎?如果它對我有用,我如何將結果傳輸到臨時表中?
哪裏查詢對於我曾經在我的模型附加屬性,現在當我想要做where
查詢自定義屬性,例如「類別」一些特殊的原因,我的臉與這個意思的錯誤無法找到與「類別」名稱列!把雄辯導致另一個表在做Laravel 5.4
爲了解決這個問題,我想如果我把我的查詢結果放到臨時表中,我可以做我想做的!
有人對此有任何想法嗎?如果它對我有用,我如何將結果傳輸到臨時表中?
您可以使用原始語句創建臨時表。這篇文章去相當深入了它:
https://laracasts.com/discuss/channels/laravel/how-to-implement-temporary-table
您將無法使用限制模型訪問的動態領域的數據庫中查詢,因爲那場很顯然,在數據庫中不存在。
但是,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();
的這裏的好處是邏輯應用到實際的查詢,所以他們從數據庫返回之前的記錄是有限的。主要的問題是現在你的「類別」邏輯是重複的,一次在訪問器中,一次在範圍內。此外,只有當您可以將訪問者邏輯轉換爲可由數據庫查詢處理的內容時,此功能纔有效。
我投了你的答案,因爲包含了很多學習技巧,但我的問題沒有解決這個!謝謝。 –
@BehnamAzimi你嘗試過什麼,什麼都不起作用? – patricus
我想搜索每個頻道的類別並選擇具有我需要的類別的頻道。通過你的方式,我不能做我的類別的哪裏條款。我面臨「表中不存在類別列」的錯誤。所以我嘗試了很多東西,終於解決了我的問題!我將很快在[這個問題]中將其作爲答案(https://stackoverflow.com/questions/44582775/where-query-after-wherehas-not-work-as-it-should-in-laravel-5-4/44582967?noredirect = 1個#comment76158424_44582967)。 –
但是我想把我的查詢結果放到臨時表中,有可能嗎? –
是的,我不明白爲什麼不,爲什麼不像內存中的SQLite連接,數據都在連接關閉下。 – btl