Laravel 5如何在创建时向用户添加多个外键约束?

Laravel 5如何在创建时向用户添加多个外键约束?,laravel,eloquent,laravel-5,laravel-5.1,Laravel,Eloquent,Laravel 5,Laravel 5.1,我现在知道,我可以通过以下方式使用区域和用户之间的haveMany关系创建用户: $region = Region::find($data['region_id']); $region->users()->create([ 'username' => $data['username'], 'email' => $data['email'], 'first_name' => $data['first_name'], 'last_name' =

我现在知道,我可以通过以下方式使用区域和用户之间的haveMany关系创建用户:

$region = Region::find($data['region_id']);

$region->users()->create([
   'username' => $data['username'],
   'email' => $data['email'],
   'first_name' => $data['first_name'],
   'last_name' => $data['last_name'],
   'password' => bcrypt($data['password']),
]);
但是,如果有多个外键,如何创建一个用户而不使其可填充多个外键约束?如果有3个或4个呢

不同模型中设置的关系示例:

Region hasMany Users, or
User belongsTo a Region

Location hasMany Users, or 
User belongsTo a Location
如果我的迁移有助于更好地理解关系,那么精简版的迁移看起来是这样的:

    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('region_id')->unsigned();
        $table->integer('location_id')->unsigned();
        $table->timestamps();

        $table->foreign('region_id')
              ->references('id')
              ->on('regions');

        $table->foreign('location_id')
              ->references('id')
              ->on('locations');
    });

    Schema::create('regions', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 100);
        $table->timestamps();
    });

    Schema::create('locations', function (Blueprint $table) {
        $table->increments('id');
        $table->string('street_address', 100);
        $table->string('city', 50);
        $table->string('province', 50);
        $table->string('country', 50);
        $table->string('postal_code', 10);
        $table->timestamps();
    });
区域和位置模型示例:

/**
 * Region may have many users.
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function users()
{
    return $this->hasMany('App\User');
}


/**
 * Location may have many users.
 *
 * @return \Illuminate\Database\Eloquent\Relations\HasMany
 */
public function users()
{
    return $this->hasMany('App\Location');
}

我假设你有一个区域和位置的模型。每个区域都有一个id,每个位置都有一个id,然后只需添加

$this->hasMany('where your Region model is', 'region_id', 'id');
$this->hasMany('where your Location model is', 'location_id', 'id');
到您的用户模型

参考:

编辑:您也可以在任何模型中进行编辑

if ($this->create()) {
  return (new Model())->create(the params you need in another model);
}

你不是只要在用户模型中添加你需要定义的数量就可以了吗?嗨@Blkc,我从一个区域到另一个用户有一个hasMany,从一个用户到另一个区域则相反。我也有一个从地点到用户的hasMany,反过来是从用户到地点的belongsTo。因此,关系就在那里,如果我这样做:Region::find(1)->create([…])我会得到一个具有区域的用户,但是没有设置位置id,除非我将其传递到create并使位置id可填充。据我所知,你不是这样做的。所以我们认为在ORM中一定有一种方法可以做到这一点:Region::find(1)->create([…])->location('23');从您描述的内容来看,我仍然看到Region和Location之间的共同点是User,那么为什么不在用户模型中传递一个User::create并将引用id填充到Location和Region?如果我弄错了,那么你能告诉我你的3个表(Region、User、Location)是什么样子吗?嗨@Blkc,我被告知让Region\u id和Location\u id等外键可填充并传入值不是一个好的做法,相反,我应该使用ORM,就像我使用Region关系创建用户的第一个片段一样,但是我必须通过要填写的位置号。想知道我是否可以做其他事情,比如:$region->users()->create([…])->withLocation(32);(我只是编了个例子)。也许我应该让外键可以填充?但问题是,假设你的region_id在你的用户表中是2,你的region表的主id也应该是2。这就是为什么我们需要外键和本地键。我不明白为什么在模型中调用另一个模型是件坏事。您好,我的代码中已经有了这一点,但是当您从第一个代码段运行$region->users()->create([…])时,除非我在用户模型中使location_id可填充,否则永远不会设置location_id,并且外键不应该被填充。因此,我可以通过使用问题中的第一个代码片段创建一个具有区域的用户,或者我可以以类似的方式创建一个具有location\u id的用户,但是我不知道如何创建一个同时设置了region\u id和location\u id的用户;Region表包含Region_id作为主用户id;然后你可以把region\u id链接到region\u id,user\u id链接到user\u id,位置也是这样?作为我对您问题的最后一点评论,您可能需要在问题中显示您的表格。您好,我在问题中添加了我的模式。很抱歉,我对Laravel很陌生,我似乎对文档示例了解得足够多,可以做得更简单,但我完全不知道如何在简单关系之外使用ORM。哦,我想我明白你现在说的了。。。你的意思是我可以调用$region->users()->create([…]);内部用户从集合中取出我需要的任何东西来创建位置?当它返回所创建位置的id时,您是否通过在用户中填充来批量分配新位置的id?是的,有点像这样。我认为,只要在两个表中保持外键和本地键的值相同,就可以使用任何方法。