将数据透视表附加到laravel中的其他两个表

时间:2014-07-10 23:16:29

标签: php laravel pivot pivot-table

我有2张桌子。一个是用户,一个是位置。我创建了一个名为user_locations的数据透视表。用户可以拥有一个或多个位置。位置可以属于一个或多个用户。所以我在这些桌子上有很多关系。我已经从laravel中了解了附加方法,但我不太清楚如何使用它。

在我的用户和位置表中,我有一个ID,它都进入我的数据透视表user_id和location_id。

$user = new User;
$user->organisation_id = Auth::user()->organisation_id;
$user->fill(Input::except('locations'));

$input_locations = Input::only('locations');

foreach($input_locations as $input_location){
$location_id = Location::where('name', '=', $input_location)->get();
$location = Location::find($location_id);

$user->User_location()->associate($location);

此刻我遇到了两个问题。在Location :: where(' name ...我应该从$ input_locations检查id但我不知道如何获取id?有一个id和一个名字来自Input :: only ('地点')。

我的第二个问题是最后一行代码。在这里我应该使用附加。我在laravel docs中找到了这个:

您还可以传递应存储在数据透视表中的属性数组:

 $user->roles()->attach(1, array('expires' => $expires));

所以我认为它应该是这样的:

 $user->user_locations()->attach(the new user id, array('location_id' => $location_id));

真的希望有人可以帮助我,因为我真的不知道从这里出发。

更新

这是我的用户控制器:

 public function createUserPost()
{
    $user = new User;
    $user->organisation_id = Auth::user()->organisation_id;
    $user->fill(Input::except('locations'));

    // pak het field locations
    $input_locations = Input::only('locations');

    if($user->save())
    {
        // Koppel de id's van de locatie aan de nieuwe user
        $new_user_id = $user->id;
        foreach ($input_locations as $key => $value) {
            $location = Location::find($value);
            User::find($new_user_id)->locations()->attach($location);
        }
        return Redirect::to('users/'.$user->id);
    }
    return $this->createUser($user);
}

在我的用户模型中,我有这条规则:

 'locations' => 'required',

这是必需的,因为它是必填字段。现在,当我点击提交按钮时,它不会保存用户,但会显示字段"位置"在填充时是必需的。问题是选择的名称是位置。但是我不知道怎么把它放到我的桌子里,因为我没有一个叫做位置的专栏。只需填写我的数据透视表,并确保表单中需要该字段。

1 个答案:

答案 0 :(得分:0)

为什么不使用Laravel's Relations

你想要多对多的关系。在这种情况下,将您的数据透视表重命名为location_user(默认情况下,它应该按字母顺序排列)。

然后定义你的关系:

// In User.php model
protected $fillable = ['first_name', 'last_name']; \\ List of all allowable items to be filled

public function locations()
{
    return $this->hasMany('Location');
}

// In Location.php model
public function users()
{
    return $this->hasMany('User');
}

之后,有很多方法可以将Location附加到User。最好的方法是:

public function createUserPost()
{
    $user = new User(Input::all); // Use the $fillable in the model to allow mass assign

    // This should be done via a relationship
    $user->organisation_id = Auth::user()->organisation_id;

    // pak het field locations
    $input_locations = Input::only('locations');

    $location_ids = [];
    foreach($input_locations as $key => $id) {
        $location_ids[] = Location::find($value)->id;
    }
    $user->locations()->attach($location_ids);

    if($user->save())
    ...
}