2013-05-15 6 views
3

Можно ли расширить модель laravel 4 eloquent с помощью другой модели, допустим, у меня есть модель пользователя, расширяющая класс eloquent, и, кроме того, есть второй класс, класс администратора, расширяющий пользовательский класс ?Laravel eloquent model - model extends model

Если я только что связал класс администратора с пользователем, я должен был бы получить доступ к атрибутам администраторов, сначала получив атрибут администратора пользователя, а затем получив атрибуты админов.

EDIT:

Скажем, у меня есть администратор не расширяя пользователя. Мне нужно будет получить доступ, например. номер телефона (атрибут администратора), например, $user = User::find(1); $phone = $user->administrator->phone; , но позвольте администратору продлить пользователя. Я могу получить доступ к телефонному номеру прямо как это возможно. $user = Administrator::find(1); (Обратите внимание, что идентификатор, переданный для поиска Администратора, такой же, как и один из которых я использую для получения пользователя. Обычно мне пришлось бы передавать реальный идентификатор записи в базе данных администратора) $phone = $user->phone; В то же время можно было бы получить доступ к атрибуту пользовательского класса, например $phone = $user->email;

или, может быть, есть лучшее решение для достижения этой цели, или это не имеет смысла использовать его, как это, если это так, не стесняйтесь сказать мне

+1

Не знаете, что вы имеете в виду, можете ли вы объяснить, чего вы хотите достичь? – Usman

+0

Почему вы задаете вопрос, прежде чем на самом деле пытаетесь сделать то, что вы описали, а затем, согласно результату, подействуйте на него? Я мало знаю о Larvel's Eloquent, но я знаю, что вы можете продлить класс, который расширил еще один класс, что является одной из причин, почему OO была изобретена. –

+0

, потому что я также хотел получить оценку того, насколько практично моя идея –

ответ

3

Это хорошая идея, в принципе, плохая идея в практика. Если обе модели используют одну и ту же таблицу, и единственная разница - это поле, то нет смысла в добавлении модели загрязнения. Что еще хуже, вам придется изменить способ, которым Laravel обрабатывает отношения (один-ко-многим), чтобы интеллектуально вернуть объект Administrator или User при получении пользователей через другие модели.

Рассмотрите выполнение следующих вместо:

class User extends \Laravel\Eloquent { 
    public function isAdministrator() { return !!$this->is_admin; } 
    public static function findAdministrator($r=false) { 
     if ($r) return self::where("is_admin","=",true)->where("id","=",(int)$r); 
     else return self::where("is_admin","=",true); 
    } 
} 

Делать это открывает два новых метода на модели: isAdministrator, которая возвращает логическое значение ИСТИНА, если пользователь является администратором, логическое значение FALSE в противном случае. findAdministrator, который ведет себя как find, но выборочно выбирает администраторов.

Это позволяет вам не иметь двух моделей для того, что по существу является отношениями (администратор остается пользователем, в конце концов). Это также позволяет вам легко выбирать, что вам нужно, с помощью полезных атомных методов.

+0

спасибо, я сделаю так –

+0

'findAdministrator' также можно выразить как область! –