php - relacionadas - relaciones laravel
Laravel guarda la asignación de masa con una relación morphMany (1)
Como a menudo con las preguntas de SO, escribir y formatear me dio tiempo para pensar ...
$input = Input::all();
$contents = Input::get(''content'');
unset($input[''content'']);
$news = News::create($input);
foreach ($contents as $c) {
$content = Content::create($c);
$news->content()->save($content);
}
$news->save();
¡Trabajos! Pero se siente un poco hackish. ¿Hay una forma más "elocuente" de asignar en masa los modelos relacionados?
Editar: probablemente este sea el curso de acción generalmente correcto; la asignación masiva no manejará las relaciones, pero al menos puedo asignar en masa cada modelo individualmente.
Solo necesito hacer malabares con la entrada un poco, lo que probablemente tendré que hacer de todos modos una vez que la validación se haya agregado a la ecuación.
Edit2: Tener mucho éxito moviendo la lógica del modelo relacionado a ese modelo y manteniéndolo simple, por ejemplo:
$input = Input::all();
unset($input[''content'']);
$news = News::create($input);
$news = Content::updateAll($news, true);
$news->save();
para crear , y:
$input = Input::all();
unset($input[''content'']);
$news = News::find($id)->fill($input);
$news = Content::updateAll($news, false);
$news->save();
para actualizar
El método updateAll()
, para cualquier persona interesada:
public static function updateAll($model, $create = false) {
$contents = Input::get(''content'');
foreach ($contents as $k => $c) {
// Save against parent model
if ($create) {
$content = Content::create($c);
} else {
$content = Content::find($k)->fill($c);
}
$model->content()->save($content);
}
return $model;
}
¡Ahora siento que estoy usando toda la potencia!
Estoy mirando la asignación de masa en Laravel, e intento asignar datos en masa para un modelo y su modelo relacionado.
Mis modelos:
class News extends Eloquent {
protected $table = ''news'';
protected $fillable = array(
''title'', ''slug'', ''author'', ''img'', ''content'',
);
public function content() {
return $this->morphMany(''Content'', ''morphable'')->orderBy(''section'');
}
}
class Content extends Eloquent {
protected $table = ''contents'';
protected $fillable = array(
''rawText'', ''section'',
);
public function morphable() {
return $this->morphMany();
}
}
Mi entrada
Tengo Input:all()
ve así, procedente del formulario:
array(6) {
["_token"]=>
string(40) "irrelevant"
["title"]=>
string(11) "Happy Title"
["author"]=>
string(9) "Mr. Happy"
["slug"]=>
string(11) "happy-title"
["img"]=>
string(9) "happy.png"
["content"]=>
array(1) {
[0]=>
array(2) {
["section"]=>
string(4) "body"
["rawText"]=>
string(27) "# I''m happy! ## So happy"
}}}
¿Qué debo hacer ahora para guardar realmente los datos como dos nuevas filas de bases de datos? (uno en las noticias, uno en los contenidos)
Pensé que ahora sería tan simple como:
$news = News::create(Input::all());
$news->push();
Pero claramente me falta algo.
Me sale el error: preg_replace(): Parameter mismatch, pattern is a string while replacement is an array
¿La asignación de masa no funciona en absoluto con los modelos relacionados?
¿O funciona bien, pero no con morphMany relations?
¿He entendido mal $model->push()
, o $model::create
?
Gracias por adelantado.