1

CodeIgniter の Datamapper ORM から来て、私はまだ Laravel の Eloquent ORM について理解を深めようとしています。

ACCOUNT と USER テーブル (簡略化) があるという事実を考えると:

ACCOUNT
- id
- name

USER
- id
- account_id
- username

1 つのアカウントには多くのユーザーがいます。1 ユーザーは 1 アカウントに属します。そのため、1 対多の関係を扱っています。すべてがモデルですでに設定されています。

CodeIgniter の Datamapper では、次のようにして任意の ID からユーザーを取得し、同時にそのユーザーが現在のアカウントに関連しているかどうかを確認します。

$u = new User();
$u->where('username', $username);
$u->where_related_account('id', $account_id);
$u->get();

if ( ! $u->exists()) exit; // or do something...

// otherwise continue to use the "$u" user object

この構文は非常に論理的で理解しやすいものです。Eloquent では、同様の簡単な構文で同じことを達成するのに苦労しています。誰か提案はありますか?

4

2 に答える 2

0

モデルとデータベーステーブルを正しく設定した場合(@msturdyが言ったように)、実際には次のようにしてユーザーアカウントを返すことができるはずです:

$user = User::whereUsername($username)
            ->first(); // or User::where('username', $username)->first();
if ($user) {
    $account = $user->accounts()
                        ->whereId($account_id)
                        ->first(); // or $user->accounts()->where('id', $account_id)->first();
}

これにより、ユーザー モデルとアカウント モデルにアクセスできるようになります。

Userモデルを拡張して、次のメソッドを含めることもできます。

class User extends Eloquent {

    ...

    public static function byUsername($username) {
        return static::whereUsername($username)->first();
    }

    public function getAccount($id) {
        return $this->accounts()->whereId($id)->first();
    }

    ...

}

そして、単に行く

$user = User::byUsername($username);
if ($user) {
    $account = $user->getAccount($account_id);
}

複数のコントローラーでコードを使用している場合は、これが適している可能性があります。

于 2013-11-21T11:10:24.233 に答える