que - laravel yield example
Guardar registros relacionados en laravel (3)
Tengo usuarios y los usuarios pertenecen a un concesionario.
Tras el registro del usuario, intento salvar un nuevo usuario y un nuevo concesionario.
La base de datos de usuario tiene una columna de dealership_id
, que quiero que se rellene con la ID del concesionario recién creado.
Este es mi código actual en el método de tienda 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";
}
Intentando usar $user->push();
Los datos del usuario se actualizan, pero el concesionario no se crea ni se actualiza.
Al utilizar push en el modelo de Usuario, Laravel básicamente realiza llamadas de forma recursiva para guardar todos los modelos relacionados (que, en este caso, no es ninguno, ya que aún no ha asociado ningún otro modelo).
Por lo tanto, para lograr lo que está tratando de hacer, primero puede crear al usuario y luego asociar el concesionario con lo siguiente:
$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";
Sin embargo, antes de hacer esto, debe asegurarse de que sus modelos de Usuario y Concesionario tengan sus relaciones establecidas correctamente:
Modelo de usuario:
public function dealership()
{
return $this->belongsTo(''Dealership'');
}
Modelo de concesionario:
public function users()
{
return $this->hasMany(''User'');
}
Eloquent''s push()
guarda el modelo y sus relaciones, pero primero debe decir qué desea involucrarse en la relación.
Dado que su modelo / tabla de usuario posee la identificación del concesionario, supongo que un usuario puede pertenecer a un solo concesionario, por lo que la relación debería ser así:
Modelo de usuario:
public function dealership()
{
return $this->belongsTo(''Dealership'');
}
Modelo de concesionario:
public function users()
{
return $this->hasMany(''User'');
}
Para guardar un usuario desde la perspectiva del concesionario, haga esto:
$dealership->users()->save($user);
Para asociar un concesionario con un usuario, debes hacer esto:
$user->dealership()->associate($dealership);
$user->save();
Por favor, compruebe esta respuesta para ver la diferencia entre push () y save ()
Tendrá que definir correctamente las relaciones de sus modelos según la documentación. Si esto se hace correctamente, debería funcionar. Esto es lo que push () hace:
/**
* 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;
}
En su caso, tiene uno (concesionario) pertenece a muchos (usuarios)
En su modelo de usuarios:
class Users extends Eloquent {
public function dealership()
{
return $this->belongsTo(''Dealership'');
}
}
En el ejemplo anterior, Eloquent buscará una columna de concesionaria_id en la tabla de usuarios. En su modelo de concesionario:
class Dealership extends Eloquent {
public function users()
{
return $this->hasMany(''User'');
}
}
En tu función de tienda:
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";
}
Aprende más sobre relaciones elocuentes
También por favor mira mi respuesta aquí