【问题标题】:How to query relationships in Laravel 4 with Eloquent?如何使用 Eloquent 在 Laravel 4 中查询关系?
【发布时间】:2013-07-20 10:12:25
【问题描述】:

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

【问题讨论】:

    标签: codeigniter orm laravel eloquent


    【解决方案1】:

    很简单(忽略用户和账号的关系),可能就是:

    $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();
    }
    

    【讨论】:

      【解决方案2】:

      如果您正确设置了模型和数据库表(正如@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);
      }
      

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

      【讨论】:

        猜你喜欢
        • 2017-01-14
        • 2013-10-03
        • 2017-07-19
        • 2017-10-24
        • 2019-02-15
        • 1970-01-01
        • 2021-09-25
        • 2015-01-21
        • 1970-01-01
        相关资源
        最近更新 更多