Laravel 5从关系模型中获取行

时间:2015-12-05 15:51:59

标签: php laravel laravel-5

我有以下关系模型设置:

  • 用户
  • 用户可以拥有多个职称
  • 用户可以拥有多种员工类型

    <?php
    
    namespace App\Models\User;
    
    use Illuminate\Auth\Authenticatable;
    use Illuminate\Database\Eloquent\Model;
    use Illuminate\Auth\Passwords\CanResetPassword;
    use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
    use Illuminate\Contracts\Auth\CanResetPassword as CanResetPasswordContract;
    
    class User extends Model implements AuthenticatableContract, CanResetPasswordContract
    {
        use Authenticatable, CanResetPassword;
    
        /**
         * The database table used by the model.
         *
         * @var string
         */
        protected $table = 'user';
    
        /**
         * The attributes that are mass assignable.
         *
         * @var array
         */
        protected $fillable = ['first_name', 'last_name', 'email', 'status', 'activation_code'];
    
        /**
         * The attributes excluded from the model's JSON form.
         *
         * @var array
         */
        protected $hidden = ['password', 'remember_token', 'activation_code'];
    
        /**
         * The roles that belong to the user.
         *
         * @return Object
         */
        public function roles()
        {
            return $this->belongsToMany('App\Models\User\Role')->withTimestamps();
        }
    
        /**
         * The employee types that belong to the user.
         *
         * @return Object
         */
        public function employeeTypes()
        {
            return $this->belongsToMany('App\Models\User\EmployeeType')->withTimestamps();
        }
    
        /**
         * The job itles that belong to the user.
         *
         * @return Object
         */
        public function jobTitles()
        {
            return $this->belongsToMany('App\Models\User\JobTitle')->withTimestamps();
        }
    }
    

现在,我希望能够选择用户列表及其所有职位和员工类型。

我尝试过这样的事情没有这样的运气!请问有人可以告诉我这是怎么回事吗?

$this->user->whereIn('id', $ids)->jobTitles()->get();

上面的代码给出了错误:

  

调用未定义的方法Illuminate \ Database \ Query \ Builder :: jobTitles()

1 个答案:

答案 0 :(得分:3)

使用eager loading

Set α

您只能直接从模型中调用关系,这就是您的尝试失败的原因($this->user->whereIn('id', $ids)->with('jobTitles', 'employeeTypes')->get(); 返回whereIn())。

Eager / nested加载是在循环遍历多个模型及其关系之前获取数据的非常有效的方法(否则您可能最终会有大量的数据库查询);)