2013-05-25 139 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