Laravel 5.1 Eloquent关联模型-如何更新外键列?

5
我是一名 Laravel 的初学者,在之前从未使用过框架。我创建了一个名为 'tabletest' 的数据库,其中包含两张表。一张是用户表,另一张是电话表。用户表有两列(id 和 name),电话表有三列(id、phone 和 user_id)。我的目标是,通过表单获取输入,并将输入发送到数据库中的相应表格。虽然名称和电话已正确保存在不同的表格中,但外键列 user_id 却没有被更新,始终为 0。现在该怎么办呢?
迁移文件如下:
用户表:
public function up()
    {
        Schema::create('user', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->timestamps();
        });
    }

手机表格:

public function up()
    {
        Schema::create('phone', function (Blueprint $table) {
            $table->increments('id');
            $table->string('phone');
            $table->unsignedInteger('user_id');
            $table->timestamps();
        });
    }

用户模型:

use App\Model\Phone;
class User extends Model
{
  protected $table = "user";
  protected $fillable = ['name'];

  public function phone(){
    return $this->hasOne(Phone::class);
  }
}

手机型号:

use App\Model\User;
class Phone extends Model
{
    protected $table = "phone";
    protected $fillable = ['phone','user_id'];

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

PhoneController.php

   <?php

    namespace App\Http\Controllers;

    use Illuminate\Http\Request;

    use App\Http\Requests;
    use App\Http\Controllers\Controller;
    use App\model\User;
    use App\model\Phone;
    class PhoneController extends Controller
{
     public function store(Request $request)
        {
            User::create([

                'name' => $request->name
                ]);
            Phone::create([
                'phone' => $request->phone
               ]);
        }
}

这是手机表的截图:phone table

1个回答

3

你没有具体说明你正在为哪个用户创建电话号码。尽管你有一个外键,它只对user_id列进行索引和约束。MySQL不能“读取”你的php代码并假设你正在为哪个用户创建电话号码。

有几种选择:

第一种:

$user = User::create([
    'name' => $request->input('name')
]);

Phone::create([
    'phone' => $request->phone,
    'user_id' => $user->id
]);

另一种方法是:
$user = User::create([
        'name' => $request->input('name')
    ]);

$user->phone()->create([ // this uses the create method on the users phone relationship
    'phone' => 999999999,
]);

我不确定是否可以更改这个,但为了可读性,我不建议这样做(即User::create([])->phone()->create([]);)。


在代码行'name' => $request->input('name');中出现了错误,报告了PhoneController中的致命错误异常。语法错误,意外的';',期望']'。@pistachio - Noob Coder
1
抱歉,请去掉分号,用逗号隔开:'name' => $request->input('name'), - Pistachio
哇,它起作用了 :D 谢谢你! 兄弟,请问能解释一下这一行吗? 'name' => $request->input('name'), 因为我理解的是,您从表单中获取了名称属性并将其放入 $user 对象中。然后您使用 'user_id'=>$user->id; 从 $user 对象分配 user_id 值。那我为什么需要在我的模型中指定这些行呢?public function user(){ return $this->belongsTo(User::class); }public function phone(){ return $this->hasOne(Phone::class); } - Noob Coder
1
$request 对象包含了所有的 HTTP 请求数据,包括表单数据。因此当你使用 $request->input('name') 时,你就是在请求名为 name 的输入字段。你所问的 phone()user() 方法是关系型函数。使用 hasOne 表示用户拥有一个电话,而使用 belongsTo 表示电话属于一个用户。这是一种一对一的关系。这意味着你可以使用该关系来快速访问用户的电话。假设你有一个视图,需要展示用户的个人资料,你可以这样写: 姓名:{{ $user->name }} - 电话:{{ $user->phone->phone }}。注意我指定了要输出的字段,否则将会输出整个电话对象。 - Pistachio
1
$users = User::with('phone', 'address')->get(); - Pistachio
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接