将额外的表/数据加载到用户对象

时间:2018-03-02 08:44:37

标签: php laravel laravel-5 laravel-5.6

在Laravel 5.6中,我正在尝试将数据加载到用户对象中,因此我可以查看用户凭据/设置等。

令人讨厌的是我有它工作,但由于某种原因现在它似乎停止了,我不知道我改变了什么来打破它。

无论如何,我想加载两个表,accesssettings。它们都有user_id字段,其中包含相应的user_id

在我的User.php课程中,我有两个功能:

public function access() {
    return $this->hasMany(Access::class);   
}
public function settings() {
    return $this->hasOne(Settings::class);
}

Use - 将它们放在班级的顶部(即use \App\Access),如果这有任何区别的话。

然后Access类看起来像:

namespace App;
use Illuminate\Database\Eloquent\Model;
class Access extends Model
{
    protected $table = "access";
}

Settings类非常相似:

namespace App;
use Illuminate\Database\Eloquent\Model;
class Settings extends Model
{
    protected $table = "settings";
}

但是,每当我尝试访问Auth::user()->settingsAuth::user()->access时,我都会收到undefined index:错误。这令人沮丧,因为我说我前几天工作了,而且我不确定发生了什么变化。

1 个答案:

答案 0 :(得分:1)

你可以在这里尝试几件事。首先,loadMissing之间的Lazy Eager Load关系:

// settings
Auth::user()->loadMissing('settings');
// access
Auth::user()->loadMissing('access');
  

要仅在尚未加载关系时加载关系,请使用loadMissing方法

其次,您可以在查询用户时使用with,尽管它与使用auth facade不相关:

User::with(['settings', 'access'])->where('atribute', $value)->get();

最后,如果您始终希望始终与每个settings模型一起返回accessuser关系,请在with上设置user属性模型:

public class User {
    protected $with = ['settings', 'access'];
    ...
}

我通常也会在模型上定义反比关系,因此AccessSettings会定义BelongsTo关系:

class Access extends Model
{
    protected $table = "access";

    public function user() {
        return $this->belongsTo(User::class);
    }
}

class Settings extends Model
{
    protected $table = "settings";

    public function user() {
        return $this->belongsTo(User::class);
    }
}