2014-02-16 95 views
4

下面是一個示例數據庫表(users):雄辯模型的默認範圍?

id - int(11) auto_increment 
name - varchar(100) 
banned - int(1) 

banned是一個布爾值,它是0false)由缺省值。如果用戶被禁止,則值爲1

我想排除禁止所有查詢的用戶默認。我可以創建一個query scope然後在任何地方使用。但是,我更喜歡簡單地在默認情況下進行檢查。

我也可以創建自己的newQuery - 方法,像這樣:

// Inside User-model, which extends Eloquent 
public function newQuery($excludeDeleted = true) 
{ 
    $builder = parent::newQuery($exludeDeleted); 
    $builder->where('banned', '=', '0'); 
    return $builder; 
} 

但是,這樣一來我就無法關閉這種行爲。我可能想在我的私人管理面板中看到被禁用的用戶,但無法執行,因爲此限制將應用於通過Eloquent完成的任何查詢。

有關如何解決此問題的任何想法?

+0

據我所知,覆蓋'newQuery()'確實是唯一的方法。我發現自己處於類似的情況,我考慮創建一個scopeBase(),這是一個個人約定(不是Laravel的!),並努力記住調用'Model :: base() - > get )'等,只要我需要訪問模型。這很不理想,但是可以省略'newQuery()'。我想他們倆都很糟糕。 JohnTaa的答案似乎可以幫助你。 – alexrussell

+1

做了一些挖掘。你可以應用全局範圍[像這樣](https://github.com/laravel/framework/issues/3897#issuecomment-41351443)。我給出的例子是可重用的作用域;你可能不需要,因爲只有用戶可以被禁止。 – mpen

回答

0

你爲什麼不使用配置變量爲:

public function newQuery($excludeDeleted = true) 
{ 
    $builder = parent::newQuery($exludeDeleted); 
    if (Config::get('hide_banned_users', true) !== false) { 
     $builder->where('banned', '=', '0'); 
    } 
    return $builder; 
} 

和更改配置值時,你需要看到禁止用戶。

1

這聽起來很像soft deleting,但與banned_at而不是deleted_at。如果默認行爲不是爲了顯示被禁用戶,我認爲當你需要他們時(管理面板),明確要求禁止的用戶更爲直觀(如withTrashed)。

+0

我的功能與軟刪除類似,是的。 –

+0

@MarttiLaine我也在調查。還沒有找到解決方案,但[本](https://github.com/laravel/framework/blob/1181e63a49921612cf441cbad65b345ccabdcb75/src/Illuminate/Database/Eloquent/SoftDeletingTrait。php#L104-L112)可能會給我們一些線索。 – mpen

4

我強烈建議使用存儲庫設計模式進行數據庫查詢,而不要在控制器和其他地方進行直接的查詢。

// Quick example, not tested 
class UserRepositoy { // You should create an interface and maybe super class for handling common cases like caching, find(), all() etc 

    protected $include_banned = false; 
    protected $model; 

    public function __construct() // you can use DI here 
    { 
      $this->model = new User; 
    } 

    public function setIncludeBanned($bool) 
    { 
     $this->include_banned = $bool; 
    } 

    protected function includeBanned($query) 
    { 
     if ($this->include_banned) { 
      return $query->where('banned', 1); 
     } 
    } 

    public function find($id) 
    { 
     $res = $this->model->where('id', $id); 

     $res = $this->includeBanned($res); 

     return $res->get(); 
    } 

} 

現在你可以instiate在任何你需要查詢資料庫類,你有統一的API調用。在Laravel,很容易在這裏和那裏傳播小的雄辯查詢,但從長遠來看,更新/更改和應付真的很煩人。試試谷歌搜索Laravel Design Pattern,並有大量的信息和例子。已經讓我的一天已經幾次了。

如果有必要,這種模式也可以使整個雄辯與其他事物更容易溝通。