在laravel中保存相关记录

时间:2014-04-22 19:41:19

标签: laravel laravel-4 one-to-many eloquent

我有用户,用户属于经销商。

用户注册后,我尝试保存新用户和新经销商。

用户数据库有一个dealership_id列,我想用新创建的经销商的ID填充该列。

这是我UserController存储方法中的当前代码。

public function store()
{
    $user = new User();
    $user->email = Input::get('email');
    $user->password = Input::get('password');


    $dealership = new Dealership();
    $dealership->name = Input::get('dealership_name');

    $user->push();
    return "User Saved";

}

尝试使用$user->push();用户数据会更新,但不会创建或更新经销商。

4 个答案:

答案 0 :(得分:53)

Eloquent的push()保存了模型及其关系,但首先你必须告诉你想要参与关系的内容。

由于您的用户模型/表包含经销商的ID,我认为用户只能属于一个经销商,因此关系应如下所示:

用户模型:

public function dealership()
{
  return $this->belongsTo('Dealership');
}

经销商型号:

public function users()
{
  return $this->hasMany('User');
}

要从经销商角度保存用户,请执行以下操作:

$dealership->users()->save($user);

要将经销商与用户相关联,请执行以下操作:

$user->dealership()->associate($dealership);
$user->save();

答案 1 :(得分:6)

请检查this answer以查看push()和save()

的区别

您需要正确定义模型relationships as per documentation 如果这是正确的,它应该工作。 这就是push()的作用:

/**
 * Save the model and all of its relationships.
 *
 * @return bool
 */

    public function push()
    {
        if ( ! $this->save()) return false;

        // To sync all of the relationships to the database, we will simply spin through
        // the relationships and save each model via this "push" method, which allows
        // us to recurse into all of these nested relations for the model instance.

        foreach ($this->relations as $models)
        {
            foreach (Collection::make($models) as $model)
            {
                if ( ! $model->push()) return false;
            }
        }

        return true;
    }

在您的情况下,您有一个(经销商)属于许多(用户)

在您的用户模型中:

class Users extends Eloquent {

    public function dealership()
    {
        return $this->belongsTo('Dealership');

    }

}

在上面的示例中,Eloquent将在users表中查找dealership_id列。 在您的经销商模型中:

class Dealership extends Eloquent {

    public function users()
    {
        return $this->hasMany('User');
    }

}

在您的商店功能中:

 public function store()
    {
        $user = new User();
        $user->email = Input::get('email');
        $user->password = Input::get('password');


        $user->dealership = new Dealership();
        $user->dealership->name = Input::get('dealership_name');

        $user->push();
        return "User Saved";

    }  

在此了解有关eloquent relationships

的更多信息

另请选择look at my answer here

答案 2 :(得分:1)

通过在User模型上使用push,Laravel基本上是递归地调用所有相关模型上的save(在这种情况下,没有,因为你还没有将任何其他模型与它相关联)。

因此,为了完成您尝试做的事情,您可以先创建用户,然后通过执行以下操作将经销商与之关联起来:

$user = new User();
$user->email = Input::get('email');
$user->password = Input::get('password');
$user->save();

$dealership = new Dealership();
$dealership->name = Input::get('dealership_name');

$user->dealerships()->save($dealership);
return "User Saved";

但是,在此之前,您必须确保您的用户和经销商模型的关系设置正确:

用户模型:

public function dealership()
{
     return $this->belongsTo('Dealership');
}

经销商模式:

public function users()
{
    return $this->hasMany('User');
}

答案 3 :(得分:0)

这就是我设法做到的方式。

在您的控制器中:(Laravel 5)

use Auth;

$dealership->user = Auth::user()->ref_user->staff_id;