2014-04-22 60 views
25

我有用户,并且用户属于经销商。在laravel中保存相关记录

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

用户数据库有一个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();用户数据得到更新,但经销商未被创建或更新。

+0

哪个代码获取的部分是经销商ID? – ajtrichards

+0

对不起,如果我包含我的模型的代码,我想也是有帮助的,哈哈。 http://laravel.io/bin/N7Pm – BeardedInBindary

回答

35

雄辩的push()保存模型及其关系,但首先你要告诉你,你要参与relationsship什么。

由于用户模型/表保存经销的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(); 
+0

谢谢!我喜欢这种感觉让我更接近......我已经用例子来与用户相关联的经销商,并得到这个错误“照亮\数据库\ QueryException试图 SQLSTATE [23000]:完整性约束违规:1048列‘dealership_id’不能空(SQL:插入'users'('email','password','dealership_id','updated_at','created_at')值([email protected],Y $ mItUgj2h4JiMi666a3DHROHahjZuRDcgqCaMVDaO..TpurSMVJnWG,2014-04 -22 19:59:56,2014-04-22 19:59:56))“ – BeardedInBindary

+0

所以,我知道这意味着我需要将dealership_id放入用户表中,不知道该怎么做。我没有在迁移用户表时设置外键参考,可以添加外键规则自动修复此问题吗?再次感谢! – BeardedInBindary

+2

@SteveBalistreri我想你必须在关联它之前先保存()新的代理商:)'new Dealership()'创建一个对象,但不保存它,所以它没有ID。您必须手动调用save-method。或者你可以用'create()'来实现:'Dealership :: create(array('name'=> Input :: get('dealership_name')));'这会自动保存新创建的对象,使其具有ID与...联系。 – Quasdunk

6

请检查this answer看到推的差异()和save()

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

/** 
* 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表中寻找dealerhip_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

+0

谢谢,我想我已经正确地建立了我的雄辩关系。我在这里粘贴了[链接](http://laravel.io/bin/N7Pm)。用户表具有'dealership_id'列。似乎还没有创建经销商,并将经销商ID与用户关联起来。 – BeardedInBindary

+0

更新后,请在这里看看我的答案:http://stackoverflow.com/questions/23183394/creating-new-record-and-relationships-in-one-go/23185225#23185225。我认为,从实例中可知,首先需要保存基本模型(即)用户,并使用push()来更新 –

+1

是的,push()不适用于新记录。看到这个问题:https://github.com/laravel/framework/issues/4641考虑到push()没有多大文档记载,使用save()似乎更安全。 – JustAMartin

1

通过使用用户模型推,Laravel基本上递归调用保存所有相关模型(在这种情况下,没有,因为你hav还没有关联任何其他模型)。

因此,为了完成你想做什么,你可以做第一个创建的用户,然后经销商用它通过执行以下操作关联:

$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'); 
} 
+0

如果保存相关数据/用push()而不是save()插入新的相关记录,有可能吗? –

+0

push()不适用于新记录。看到这个问题:https://github.com/laravel/framework/issues/4641考虑到push()没有多大文档记载,使用save()似乎更安全。 – JustAMartin