1

来自 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 中,我很难用类似的简单语法来实现相同的目标。有没有人有什么建议?

4

2 回答 2

2

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

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

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

否则,假设您的 User 和 Account 类以及 DB 表设置正确(根据 Laravel 文档),您应该能够:

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

if ($user_exists)
{
    doThings();
}
于 2013-07-20T10:44:57.260 回答
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 回答