3

laravel 4の雄弁なモデルを別のモデルで拡張することは可能ですか?雄弁なクラスを拡張するユーザーモデルがあり、さらに2番目のクラス、ユーザークラスを拡張する管理者クラスがあるとしましょう?

管理者クラスをユーザーにリンクしただけの場合、最初にユーザーの管理者属性を取得してから管理者属性を取得することにより、管理者属性にアクセスする必要があります。

編集:

管理者がユーザーを拡張していないとしましょう。たとえば、このように電話番号 (管理者属性) $user = User::find(1); $phone = $user->administrator->phone; にアクセスする必要がありますが、管理者にユーザーを拡張させることで、おそらくこのように電話番号に直接アクセスできます $user = Administrator::find(1);(管理者を見つけるために渡される ID は同じであることに注意してください)ユーザーを取得するために使用するような. 通常、管理者データベースのエントリの実際の ID を渡す必要があります) $phone = $user->phone; 同時に、ユーザー クラスの属性にアクセスすることも可能です。$phone = $user->email;

または、これを達成するためのより良い解決策があるか、このように使用しても意味がない場合は、お気軽に教えてください

4

1 に答える 1

4

これは原理的には良い考えですが、実際には悪い考えです。両方のモデルが同じテーブルを使用し、唯一の違いがフィールドである場合、モデル汚染を追加しても意味がありません。さらに悪いことに、Laravel がリレーションシップ (1 対多) を処理する方法を変更して、他のモデルを介してユーザーを取得するときに 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);
     }
 }

これを行うと、モデルの 2 つの新しいメソッドが開きます:isAdministratorユーザーが管理者の場合はブール値 true を返し、それ以外の場合はブール値 false を返します。findAdministratorのように動作しfind ますが、選択的に管理者を選択します。

これにより、本質的に関係を表すモデルを 2 つ持つ必要がなくなります (結局、管理者はユーザーのままです)。また、便利なアトミック メソッドを使用して、必要なものを簡単に選択することもできます。

于 2013-05-15T13:25:02.427 に答える