2013-05-25 4 views
0

* Обратите внимание, что это вопрос относительно Laravel 4, а не Laravel 3 (который использует Fluent)Laravel 4 - Можно ли расширить класс DB?

Можно ли расширить класс DB в Laravel 4?

Я пытался что-то же просто, как это:

class Content extends DB {} 

С этим в моем маршруте:

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

И это, кажется, работает, насколько помощью «Content», как «БД» ,

Но если я пытаюсь установить имя таблицы по умолчанию аналогично тому, как вы бы в 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'

Фактически то, что я хотел бы сделать, это что-то вроде этого. В результате я могу добавить функцию, которая выполняет ряд объединений/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 возвращает что-то еще, когда вы используете DB :: table() ;. Но я действительно стараюсь следовать коду в Laravel и найти, что происходит, похоже, это что-то делать с освещением, но, честно говоря, я не совсем уверен, что это такое. Я также попытался взглянуть на «Красноречивый», чтобы посмотреть, как это происходит, но снова я просто нахожу, что Ларавель так трудно оглянуться и понять, что происходит.

+0

Методы, DB (например, «где», «присоединиться», и т.д.) являются частью класса Builder в Осветите \ имен базы данных \ Query, а не класс DB , Что вы пытаетесь сделать точно? Возможно, существует лучший подход, чем расширение классов, которые взаимодействуют с базой данных. Обычно я добавляю «some_extra_function()» к модели, которая использует эту функцию. – ARW

+0

@AdamWathan Я обновил пример, чтобы объяснить немного больше. Я в основном хочу включить функции в общий поток использования БД, вместо того, чтобы писать отдельные функции, такие как getWithPermissions() – robjbrain

+0

Похоже, что класс Builder - это то, что вы хотите расширить, должен иметь возможность добавлять туда те методы. Я не уверен, что полностью понимаю, что вы пытаетесь сделать, поэтому я не могу предложить лучший подход, но я все же думаю, что расширение этого класса с очень специфическим поведением, вероятно, не является лучшим решением. Собираетесь ли вы использовать этот материал с Eloquent, или просто используете компонент DB и делаете что-то немного более «сырым»? Что представляет собой класс «Содержание»? – 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 только для того, чтобы я мог иметь повторяющийся код для присоединения разрешений внутри функции, а не для этого отдельно каждый раз. Я попытался посмотреть, как работает Eloquent и посмотреть, как он расширяет базу данных, но я изо всех сил пытаюсь пробиться через кодовую базу Laravel. – robjbrain

+0

Dave имеет правильную идею. Вы не можете расширить класс DB, а затем назначить таблицу по умолчанию и, как ожидается, сможете перейти к Content :: where(), вам нужно будет перейти в Content :: table ('content') -> where() ... Синтаксис вы предложили именно то, как работа Дейва будет работать. Расширение класса DB не позволит вам использовать предложенный вами синтаксис. – ARW

Смежные вопросы