跪求指点-1对1的关联模型中如何更新信息

users【用户表】

users表中只存了用户名,手机号,密码

++++++++++++++++++++++++++++++++++

user_profile【用户信息表】

性别,头像,认证信息之类的字段都存到此表

后台编辑用户的时候,提交后

public function update(Request $request, $id)
    {
        $this->validate($request, [
            'name' => 'required|min:3|max:20',
            'phone' => 'required|digits:11|unique:users,phone,' . $id,
        ]);
        $user = User::find($id);
        $data = $request->all();
        if($request->password) {
            $data['password'] = Hash::make($request->password);
        } else {
            $data['password'] = $user->password;
        }
        if ($request->file) {
            $validate = ImageHelper::validate($request->file, 2000000);

            if (!$validate['success']) {
                return redirect()->back()->with('error', $validate['message']);
            }

            $image = ImageHelper::create($request->file, 600, 'admin/images/users/');

            $data['image'] = $image['filename'];
        }
        $user->update($data);
        $user->UserProfile()->update($data);

        return redirect()->route('admin::users.index')->with('success', 'User successfully updated');
    }<br></br>

关联模型中是这样写的

    public function userProfile()
    {
        return $this->hasOne('App\UserProfile', 'user_id', 'id');
    }<br></br>

更新的时候报错

QueryException in Connection.php line 655:
                            SQLSTATE[42S22]:
 Column not found: 1054 Unknown column '_token' in 'field list' (SQL: 
update `s_user_profile` set `_token` = 
2Apiil1kSDOeNzNendwjcuRj4lJTDjb11slu9nfn, `name` = XiaoYao, `phone` = 
18660407361, `sex` = 2, `password` = 
y$dWBZ/A/WGinWRlYvuFZfAeHYoq2sr46DzjDme83WETzAMR4wh9TrC, `description` =
 
测试内容</p>, `updated_at` = 2016-04-25 
08:14:38 where `s_user_profile`.`user_id` = 1 and 
`s_user_profile`.`user_id` is not null)<br></br>

谢谢大神们。

@saybye720 實際上就是 _token 的問題沒錯,User表update沒錯是因為其更新流程和UserProfile不一樣:

User是繼承於Model,其update方法是

    public function update(array $attributes = []){
        if (! $this->exists) {
            return false;
        }

        return $this->fill($attributes)->save();
    }

重點在於fill($attributes)這個方法會檢查傳進去的值是否fillable,就是你在User Model裡設置的那些

但是,$user->UserProfile()回傳的是HasOne類型的Object,其更新方法太多層,就不詳述,不過裡面並沒有對你傳進去的$attributes進行過濾,所以不管你fillable打什麼,都不會對他造成影響,最後導致你傳進去的所有欄位都會被更新,自然_token也被當成需要更新的欄位,而UserProfile並沒有這欄位也就錯誤了。

JellyBool
修改的评论也不能少于六个字哦!
saybye720
修改的评论也不能少于六个字哦!
Tomoe
修改的评论也不能少于六个字哦!
saybye720
修改的评论也不能少于六个字哦!