Досі знаходжу ноги у 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 для відповіді № 1save()
розраховує на єдину модель, 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();
}