如何用Eloquent查询Laravel 4中的关系?

时间:2013-07-20 10:12:25

标签: codeigniter orm laravel eloquent

来自CodeIgniter的Datamapper ORM我仍然试图了解Laravel的Eloquent ORM。

鉴于我有一个ACCOUNT和一个USER表(简化):

ACCOUNT
- id
- name

USER
- id
- account_id
- username

一个帐户有很多用户。一个用户属于一个帐户。所以我们正在处理一对多的关系。一切都已在模型中设置。

在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中,我很难用类似的简单语法实现相同的功能。有没有人有任何建议?

2 个答案:

答案 0 :(得分:2)

非常简单(忽略用户和帐户之间的关系),它可能只是:

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

这将返回用户的详细信息。

否则,假设您的用户和帐户类和数据库表已正确设置(as per the Laravel docs),您应该可以这样做:

$user_exists = Account::find($account_id)
                      ->users()
                      ->where("username", "=", $username)
                      ->first()
                      ->exists;

if ($user_exists)
{
    doThings();
}

答案 1 :(得分: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);
}

如果您在多个控制器中使用代码,那么对您来说可能会更好。