Я использую Kalnoy / Nestedset и пытаюсь заполнить таблицу комментариев с помощью faker, но получаю ошибку «Преобразование массива в строку».
Таблица комментариев выглядит так:
Schema::create('comments', function (Blueprint $table) {
$table->increments('id');
$table->unsignedInteger('user_id');
$table->unsignedInteger('post_id');
$table->text('body');
$table->timestamps();
$table->nestedSet();
});
Фабрика комментариев:
use Faker\Generator as Faker;
$factory->define(
App\Models\Comment::class,
function (Faker $faker) {
return [
'user_id' => function () {
return factory('App\Models\User')->create()->id;
},
'post_id' => function () {
return factory('App\Models\Post')->create()->id;
},
'body' => $faker->paragraph,
];
}
);
И я не могу понять, как должна выглядеть сеялка. Вот моя попытка:
public function run(Post $post)
{
$node = factory('App\Models\Comment'::class, 3)->create([
'children' => [
[
factory('App\Models\Comment'::class, 2)->create([
'post_id' => $post->id
]),
'children' => [
[ factory('App\Models\Comment'::class, 1)->create([
'post_id' => $post->id
]),
],
],
],
],
]);
}
}
Я также хочу убедиться, что идентификатор поста у потомков такой же, как у родительского, но теперь он возвращает ноль.
Ключи массива в методе create
должны быть атрибутами, которые существуют в вашей модели. В вашем случае children
не является атрибутом модели Comment
.
Используя пример из документации Использование фабрик, вы могли бы создать каждый комментарий, а затем использовать связь children()
в новых моделях для создания их дочерних элементов. Например:
public function run(Post $post)
{
$node = factory('App\Models\Comment'::class, 3) // Create the root comments.
->create()
->each(function ($comment) use ($post) { // Add children to every root.
$comment->children()->saveMany(factory(App\Comment::class, 2)->make([
'post_id' => $post->id
]))
->each(function ($comment) use ($post) { // Add children to every child of every root.
$comment->children()->saveMany(factory(App\Comment::class, 2)->make([
'post_id' => $post->id
]));
});
});
Это сработало, спасибо! Я обернул этот код в "factory ('App \ Models \ Post' :: class, 5) -> create () -> each (function ($ post) {", чтобы правильно получить идентификатор сообщения, и вместо этого запустил сеялку Post.
По моему опыту, «преобразование массива в строку» - это обычно что-то на заводе и обычно в фейкер. Некоторые из вспомогательных методов facker принимают второй аргумент, определяющий массив или строку. Но я бы подумал, что с
paragraph
все в порядке. Не вижу явно очевидных ошибок.