【问题标题】:Laravel - Retrieving specific column from a releted queryLaravel - 从相关查询中检索特定列
【发布时间】:2014-08-10 23:34:16
【问题描述】:

我有 4 张桌子:

conversations
- id (pk)
- userId1 (fk)
- userId2 (fk)

users
- id (pk)
- name
- surname
.
.
.
- roleId (fk)
- userStatusId (fk)

roles
- id (pk)
- type (fk)

user_status
- id (pk)
- description (fk)

这是我的模型:

    class Conversation extends Eloquent {

        public function user1(){
            return $this->hasOne('User', 'id', 'userId1');
        }

        public function user2(){
            return $this->hasOne('User', 'id', 'userId2');
        }

    }

    class User extends Eloquent {

        public function role(){
            return $this->hasOne('Role', 'id', 'roleId');
        }
        public function userStatus(){
            return $this->hasOne('UserStatus', 'id', 'userStatusId');
        }


        // public function conversation1(){
        //  return $this->belongsToMany('Conversation', 'id', 'userId1');
        // }
        // public function conversation2(){
        //  return $this->belongsToMany('Conversation', 'id', 'userId2');
        // }


    }

class UserStatus extends Eloquent {

    public $timestamps = false;
    protected $table = 'user_status';

    public function user(){
        return $this->belongsToMany('User', 'id', 'userStatusId');
    }

}

class Role extends Eloquent {

    public $timestamps = false;

    public function user(){
        return $this->belongsToMany('User', 'id', 'roleId');
    }

} 

现在我想做的是,例如,获取“userId1”(在对话中)属于状态“描述”等于“已注册”的“用户”的所有对话。

我就是这样做的:

Route::get('/', function(){
    $conversation = Conversation::with(array('user1.userStatus' => function ($query){
        $query->where('description', '=', 'registered');
    }))->get();
    foreach ($conversation as $conv) {
        echo '<br \>';
        echo $conv;
    }
});

我希望收到 userId1 的状态为“已注册”的所有对话记录,仅此而已...相反,我收到的是所有对话记录,以及每个对话记录的用户记录和userStatus 表(最后我只收到与 where 子句匹配的表和不具有空值的表)。

我知道我的英语很糟糕,但我希望有人能理解并帮助我。谢谢!

【问题讨论】:

    标签: laravel eloquent eager-loading


    【解决方案1】:

    你所有的关系都是错误的。您需要阅读http://laravel.com/docs/eloquent#relationships,在您的情况下是:

    class Conversation extends Eloquent {
    
        public function user1(){
            return $this->belongsTo('User', 'userId1');
        }
    
        public function user2(){
            return $this->belongsTo('User', 'userId2');
        }
    
    }
    
    class User extends Eloquent {
    
        public function role(){
            return $this->belongsTo('Role', 'roleId');
        }
        public function userStatus(){
            return $this->belongsTo('UserStatus', 'userStatusId');
        }
    }
    
    class UserStatus extends Eloquent {
    
        public $timestamps = false;
        protected $table = 'user_status';
    
        public function user(){
            return $this->hasMany('User', 'userStatusId');
        }
    
    }
    
    class Role extends Eloquent {
    
        public $timestamps = false;
    
        public function user(){
            return $this->hasMany('User', 'roleId');
        }
    
    }
    

    现在,只检索你想要的那些对话

    Conversation::whereHas('user1', function ($q) {
      $q->whereHas('userStatus', function ($q) {
        $q->where('description', 'registered');
      });
    })->get();
    

    或使用此 PR https://github.com/laravel/framework/pull/4954

    Conversation::whereHas('user1.userStatus', function ($q) {
      $q->where('description', 'registered');
    })->get();
    

    此外,为了使其更加冗长,您可以将该代码包装在一个作用域中:

    // User model
    public function scopeRegistered($query)
    {
      $q->whereHas('userStatus', function ($q) {
        $q->where('description', 'registered');
      });
    }
    

    然后:

    Conversation::whereHas('user1', function ($q) {
      $q->registered();
    })->get();
    

    【讨论】:

    • 因为我没有 15+ 的声誉,我无法投票赞成您的回复,但无论如何我还是要感谢您。我以为我理解了 belongsTo 和 hasAny 的含义,但事实并非如此。谢谢!
    • 没问题,如果解决了问题就标记为答案。
    【解决方案2】:

    你可以试试这个:

    $conversations = Conversation::whereHas('user1.userStatus', function ($query){
        $query->where('description', '=', 'registered');
    })->get();
    

    这将只返回相关user1.userStatusregisteredConversation 模型。

    【讨论】:

      猜你喜欢
      • 2014-04-11
      • 1970-01-01
      • 2021-02-16
      • 2017-11-18
      • 1970-01-01
      • 1970-01-01
      • 2013-05-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多