Подсчитайте предметы из чипа отношений в фейкер

У меня есть модель страницы и модель текстового блока для создания страниц с любым количеством текстовых блоков. Я использую sortable из jquery ui для сортировки текстовых блоков по полю position в таблице миграции. Поэтому каждый раз, когда я создаю текстовый блок, позиция будет count + 1, начиная с 1.

Сейчас я создаю 2 фабрики подделок, 1 для страниц и 1 для создания фиктивных текстовых блоков на страницах. Мне интересно, как я могу подсчитать количество случайных текстовых блоков, которые создаст фабрика? Таким образом, я могу сказать, что каждый раз, когда фабрика страниц создает страницу с несколькими текстовыми блоками, счетчик не отменяет количество текстовых блоков на каждой странице.

 $factory->define(Textblock::class, function (Faker $faker) {

return [
    'page_id' => Page::all()->random()->id,
    'title' => $faker->sentence(rand(2, 5)),
    'summary' => $faker->text,
    'position' => // how can i code this ?
    'visible' => $faker->boolean($chanceOfGettingTrue = 50),

]; });

person Matthias999    schedule 22.06.2020    source источник


Ответы (1)


Вы можете создать объект Counter, чтобы хранить все приращения в памяти. Что-то подобное:

class Counter
{
    private static $counters = [];

    public static function nextCounterFor($key, $default = 0)
    {
        if (!isset(self::$counters[$key])) {
            if (is_callable($default)) {
                 $default = $default();
            }
            if (!is_int($default)) {
                 throw new \RuntimeException('The default value must be an integer');
            }
            self::$counters[$key] = $default;
        }

        return ++self::$counters[$key];
    }
}

Затем вы можете использовать его для создания новых позиций для данного идентификатора страницы. Если ключ еще не определен, вы должны взять последнюю позицию, используемую для этой страницы, из базы данных (если она существует)

$factory->define(Textblock::class, function (Faker $faker) {

  $page = Page::inRandomOrder()->first();
 
  $position = Counter::nextCounterFor($page->id, static function() use ($page) {
       $lastPosition = Textblock::where('page_id', $page->id)->orderBy('position', 'DESC')->first();
       return $lastPosition !== null ? $lastPosition->position : 0;
  });

  return [
    'page_id' => $page->id,
    'title' => $faker->sentence(rand(2, 5)),
    'summary' => $faker->text,
    'position' => $position,
    'visible' => $faker->boolean($chanceOfGettingTrue = 50),
  ];
});
person Mihai Matei    schedule 22.06.2020