/ / Laravel 4 - Вставка декількох записів при використанні співвідношення hasMany - laravel, laravel-4

Laravel 4 - Вставка декількох записів при використанні співвідношення hasMany - laravel, laravel-4

Досі знаходжу ноги у Laravel 4, і я трохи не впевнений, чому це не працює.

У L3 мені вдалося вставити кілька записів у таку таблицю ...

$comments = array(
array("message" => "A new comment."),
array("message" => "A second comment."),
);

$post = Post::find(1);

$post->comments()->save($comments);

Однак коли я намагаюся зробити подібне зараз, або записи вставляються без стороннього ключа, як так ...

$comments = array(
array("message" => "A new comment."),
array("message" => "A second comment."),
);

$post = Post::first();

$post->comments()->insert($comments);

Або (і після деякого гуглінгу) я спробую наступне і отримаю preg_match() expects parameter 2 to be string, array given

$comments = new Comment(array(
array("message" => "A new comment."),
array("message" => "A second comment."),
));

$post = Post::first();

$post->comments()->save($comments);

Так само, як ...->save($comments) Я спробував ...->saveMany() і ...->associate() але у мене те саме питання, що і в останньому прикладі.

Зі сторони, я розумію, що я обернув багатовимірний масив в об'єкт, але, здається, це правильний спосіб зробити це. Я намагався не робити, але це також не вдається.

Я, мабуть, повинен зазначити, що я виконую начальну команду через ремісника.

Редагувати: Це повно preg_match помилка з файлу журналу

[2013-11-27 16:43:39] log.ERROR: exception "ErrorException" with message "preg_match() expects parameter 2 to be string, array given" in /Applications/MAMP/htdocs/project/www/bootstrap/compiled.php:6315

Відповіді:

15 для відповіді № 1

save() розраховує на єдину модель, saveMany() очікує масив моделей, а не асоціативний масив даних.

Але saveMany() не вставлятиметься за допомогою одного запиту, він фактично перетинає моделі та вставляє по черзі (зверніть увагу: L3 також це зробив).

Якщо вам потрібно вставити більший набір записів, не використовуйте ORM, використовуйте конструктор запитів, як Мануель Педрера написав перший приклад коду.

Просто для запису тут, як ви б використовували saveMany():

$post = Post::find(1);

$comments = array(
new Comment(array("message" => "A new comment.")),
new Comment(array("message" => "A second comment.")),
);

$post->comments()->saveMany($comments);

17 за відповідь № 2

Це може бути не саме те, що ви шукаєте, оскільки воно не використовує красномовного, але воно повинно зробити ваші насіння. DB::insert(), подобається це:

$postId = 1;

DB::table("comments")->insert(array(
array(
"message" => "A new comment.",
"post_id" => $postId),
array(
"message" => "A second comment",
"post_id" => $postId
),
));

Як альтернативу, ви могли б це зробити і за допомогою Красномовця, але це слід робити навпаки: встановлення відповідної моделі в "діти". Про це кажуть офіційні документи:

Пов’язані моделі (належить до)

Під час оновлення відношення належитьTo, ви можете використовувати асоційований член метод. Цей метод встановить зовнішній ключ на дочірній моделі

Я думаю, що це зроблено саме так, оскільки в базі даних "дочірньою" моделлю є та, яка містить зовнішній ключ до "батьків" (у цьому випадку, post_id)

Код повинен виглядати так:

$post = Post::find(1);

$comments = array(
array("message" => "A new comment."),
array("message" => "A second comment."),
);

foreach ($comments as $commentAttributes) {
$comment = new Comment($commentAttributes);
$comment->post()->associate($post);
$comment->save();
}