【问题标题】:Laravel 4 - Is it possible to extend the DB class?Laravel 4 - 是否可以扩展 DB 类?
【发布时间】:2013-05-21 02:54:16
【问题描述】:

*注意这是关于 Laravel 4 的问题,而不是 Laravel 3(使用 Fluent)

是否可以在 Laravel 4 中扩展 DB 类?

我尝试过像这样简单的方法:

class Content extends DB {}

在我的路线中:

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

它似乎可以使用“内容”,如“DB”。

但是,如果我尝试默认设置表名,类似于您在 Eloqeunt 中的设置并使用 where 或 join 等函数,我会收到如下错误:

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

以此为错误:

call_user_func_array() 期望参数 1 是一个有效的回调, 'Illuminate\Database\MySqlConnection' 类没有方法 '在哪里'

实际上我想做的是这样的事情。由此我可以添加一个函数,该函数执行多个连接/位置,但将其集成到使用 DB 的正常流程中。所以这个类看起来像这样:

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 中的代码并找出发生了什么,这似乎与照亮有关,但老实说我不太确定那是什么。我也尝试查看 Eloquent 以了解它是如何做到的,但我再次发现 Laravel 很难环顾四周并理解发生了什么。

【问题讨论】:

  • DB 方法(如“where”、“join”等)是 Illuminate\Database\Query 命名空间中的 Builder 类的一部分,而不是 DB 类。你到底想做什么?可能有比扩展执行数据库交互的类更好的方法。通常我会在使用该函数的模型中添加“some_extra_function()”。
  • @AdamWathan 我已经更新了这个例子来解释更多。我基本上想在使用 DB 的一般流程中包含函数,而不是编写单独的函数,例如 getWithPermissions()
  • 听起来像 Builder 类是你想要扩展的,应该能够在那里添加这些方法。我不确定我是否完全理解您要做什么,所以我不能提出更好的方法,但我仍然认为用非常具体的行为扩展该类可能不是真正的最佳解决方案。您打算将这些东西与 Eloquent 一起使用,还是只是使用 DB 组件并做一些更“原始”的事情? “内容”类应该代表什么?
  • 基本上,在从数据库中获取内容时,我经常需要“加入权限”(例如考虑阅读论坛主题的权限),最好有一个函数来完成,而不是总是写出在哪里/加入东西。

标签: orm laravel fluent laravel-4


【解决方案1】:

尝试使用 Eloquent 和 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();

【讨论】:

  • 我试图避免 ORM 的成本,因为我需要实现的目标可以在没有 ORM 的情况下完成 99%,引入 Eloquent 似乎很愚蠢,这样我就可以有重复的代码来加入权限在一个函数中,而不是每次都单独执行。我试图看看 Eloquent 是如何工作的,看看它是如何扩展数据库的,但我正在努力通过 Laravel 代码库
  • 戴夫的想法是对的。您不能扩展 DB 类,然后分配一个默认表并希望能够转到 Content::where(),您需要转到 Content::table('content')->where()... 语法您提出的正是 Dave 的实施方式。扩展 DB 类将不允许您使用您建议的语法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2012-12-30
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 2012-03-12
  • 2010-12-05
相关资源
最近更新 更多