2013-05-25 188 views
0

*注意這是關於Laravel 4而不是Laravel 3(它使用Fluent)的問題Laravel 4 - 是否可以擴展DB類?

是否可以在Laravel 4中擴展DB類?

我已經試過這樣簡單的事情,因爲這:

class Content extends DB {} 

有了這個在我的路線:

print_r(Content::table('content')->get()); 

而且它似乎就上班使用「內容」,如「DB」 。

但如果我嘗試,默認情況下類似設置的表名如何在Eloqeunt會和使用功能,如地方或加入我得到一個錯誤,像這樣:

print_r(Content::where('id', '!=', 4)->get()); 

以此爲錯誤:

call_user_func_array() expects parameter 1 to be a valid callback, class 'Illuminate\Database\MySqlConnection' does not have a method 'where'

實際上我想要做的就是這樣的事情。因此,我可以添加一個函數,它執行多個連接/哪裏,但將它集成到使用數據庫的正常流程中。因此,類是這樣的:

class Content extends DB { 
    public $table = 'content'; 

    public static function joinPermissions($permission_mask) 
    { 
     return self::where('permissions.mask', '=', $permission_mask) 
      ->where('permissions.read', '=', 1) 
      ->join('permissions', 'id', '=', 'content.permission_set'); 
    } 
} 

它會被稱爲像這樣:

Content::orderBy('time_added') 
    ->take(10) 
    ->joinPermissions($permission_mask) 
    ->get(); 

這可能嗎?我想這是需要擴展除DB以外的其他類的事情,因爲當您使用DB :: table()時,DB會返回其他類。但我真的很努力遵循Laravel的代碼,並發現正在發生的事情,這似乎是與照明有關,但說實話,我不確定那是什麼。我也試着看看雄辯,看看它是如何做到的,但我再次發現Laravel很難查找並理解發生了什麼。

+0

數據庫的方法(如「哪裏」,「加入」,等等)都在照亮\數據庫\查詢命名空間中的生成器類的一部分,而不是DB類。你想要做什麼?可能比擴展執行數據庫交互的類更好。通常我會將「some_extra_function()」添加到使用該函數的模型中。 – ARW

+0

@AdamWathan我更新了這個例子來解釋更多。我基本上希望在使用數據庫的一般流程中包含函數,而不必編寫單獨的函數,如getWithPermissions() – robjbrain

+0

類似於Builder類的聲音就是你想要擴展的東西,那麼應該能夠在那裏添加這些方法。我不確定自己完全明白你想要做什麼,所以我不能提出更好的方法,但我仍然認爲用這種非常具體的行爲來擴展這個類可能不是最好的解決方案。您是否打算將這些東西與Eloquent一起使用,或者您只是使用了數據庫組件,並將事情做得更加「生硬」?什麼是「內容」類應該代表什麼? – ARW

回答

2

嘗試使用雄辯和scopes

class Content extends Eloquent { 
    public $table = 'content'; 

    public function scopeJoinPermissions($query, $permission_mask) 
    { 
     return $query->where('permissions.mask', '=', $permission_mask) 
      ->where('permissions.read', '=', 1) 
      ->join('permissions', 'id', '=', 'content.permission_set'); 
    } 
} 

Content::orderBy('time_added') 
    ->take(10) 
    ->joinPermissions($permission_mask) 
    ->get(); 
+0

我試圖避免ORM的成本,因爲我需要實現的功能可以在沒有一個的情況下完成99%,所以引入Eloquent似乎很愚蠢,以至於我可以在一個函數內部加入重複代碼,而不是執行它每次分開。 我試着看看雄辯是如何工作,看看它如何擴展數據庫,但我努力使我的方式通過Laravel代碼庫 – robjbrain

+0

戴夫有正確的想法。你不能擴展數據庫類,然後分配一個默認表,並期望能夠去Content :: where(),你需要去Content :: table('content') - > where()...語法你提出的是Dave的實現如何工作。擴展數據庫類不會允許您使用您建議的語法。 – ARW