Php Laravel很多,如果在种子

时间:2017-10-09 10:57:34

标签: php laravel

我有一个很长的时间来制作我的种子。是否有可能缩短它? 现在它可以工作,但看起来不太好:(。我在想它可能在一个循环中,但我不能写它:( 这是我的代码:

$seed = rand(0, 2);

        if ($seed == 2) {
            $o->statuses()->attach(OrderStatusName::STATUS_DOWNLOADED_IN_STORE,
                ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
            $randOperating = rand(0, 2);
            if ($randOperating == 1) {
                $o->statuses()->attach(OrderStatusName::STATUS_OPERATING_IN_WAREHOUSE,
                    ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
                $randCompleted = rand(0, 2);
                if ($randCompleted > 1) {
                    $o->statuses()->attach(OrderStatusName::STATUS_COMPLETED_IN_WAREHOUSE,
                        ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
                    $randTrack = rand(0, 2);
                    if ($randTrack == 2) {
                        $o->statuses()->attach(OrderStatusName::STATUS_IN_TRACK,
                            ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
                        $deliveredSeed = rand(0, 2);
                        if ($deliveredSeed == 2) {
                            $o->statuses()->attach(OrderStatusName::STATUS_DELIVERED_TO_STORE,
                                ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
                            $pastSeed = rand(0, 3);
                            if ($pastSeed < 2) {
                                $o->statuses()->attach(self::ORDER_PAST_STATUSES[$pastSeed],
                                    ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
                            }
                        }
                    }
                }
            }
        }

4 个答案:

答案 0 :(得分:1)

我假设每个状态都需要before to status来制作逻辑。我创建一个包含逻辑顺序的所有状态的数组,然后生成一个位置以循环它们并创建所需的每个状态。

$pastSeed = rand(0, 3);
$cases = [OrderStatusName::STATUS_DOWNLOADED_IN_STORE,OrderStatusName::STATUS_OPERATING_IN_WAREHOUSE,OrderStatusName::STATUS_COMPLETED_IN_WAREHOUSE,OrderStatusName::STATUS_IN_TRACK,self::ORDER_PAST_STATUSES[$pastSeed],NULL];

$case = rand(0,sizeof($cases));

if($cases[$case] != null){
   for($i = 0; $i<=$case; $i++){
       $o->statuses()->attach($cases[$i],['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
   }
}  

答案 1 :(得分:1)

你可以循环,特别是第一部分,因为它们是固定的状态。最后一个是具有不同随机数的不同情况,但主要是因为它根据随机数从数组中获取值,所以你会得到一个循环和其他东西......

$checknext = true;
$statuses = [
  OrderStatusName::STATUS_DOWNLOADED_IN_STORE,
  OrderStatusName::STATUS_OPERATING_IN_WAREHOUSE,
  OrderStatusName::STATUS_COMPLETED_IN_WAREHOUSE,
  OrderStatusName::STATUS_IN_TRACK,
  OrderStatusName::STATUS_DELIVERED_TO_STORE
];

foreach($statuses as $status) {
  if (!($checknext = rand(0, 2) == 2))
    break;
  }
  $o->statuses()->attach($status, ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
}
if ($checknext && ($pastSeed = rand(0, 3)) < 2) {
  $o->statuses()->attach(self::ORDER_PAST_STATUSES[$pastSeed],
    ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
}

您甚至可以使其更高级,并将self::ORDER_PAST_STATUSES添加到数组中。在循环内部,您可以检查它是否是一个数组,在这种情况下,执行稍微不同的处理:

  if (is_array($status)) {
    $max = count($status)*2-1;
    $rand = rand(0, $max);
    if ($rand < count($status) {
      $o->statuses()->attach($status[$rand},  .... );
    }
  }

使其更灵活的其他方法是不仅添加状态,还添加状态数组的机会。在循环中你可以检查

rand(0, $chance) == 1

或数组:

count($status) * $chance - 1

我想展示这种可能性,但是如果你问我这会增加很多复杂性,同时节省很少的代码。订单状态也可能不会发生很大变化,因此您不必经常触摸此代码。最后,我会选择之前在评论中提到的早期退出解决方案,并且在他的回答中由madpoet证明。

答案 2 :(得分:0)

我认为,因为你需要在每个if中做一个随机数,并且所有条件都不同,你实际上需要编写比你发布的代码更多的代码来定义每个条件和每个状态。然而,我要做的一件事就是挑出重复的代码,使它看起来更苗条。

$randNumber = function ( $value = 2 ) {
    return rand(0, $value);
};

$attachStatus = function ( $status ) use ( $o, $int ) {
    $o->statuses()->attach($status, ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')]);
};

if ($randNumber() == 2) {
    $attachStatus( OrderStatusName::STATUS_DOWNLOADED_IN_STORE );
    if ($randNumber() == 1) {
        $attachStatus( OrderStatusName::STATUS_OPERATING_IN_WAREHOUSE );
        if ($randNumber() > 1) {
            $attachStatus( OrderStatusName::STATUS_COMPLETED_IN_WAREHOUSE );
            if ($randNumber() == 2) {
                $attachStatus( OrderStatusName::STATUS_IN_TRACK );
                if ($randNumber() == 2) {
                    $attachStatus( OrderStatusName::STATUS_DELIVERED_TO_STORE );
                    $pastSeed = $randNumber(3);
                    if ($pastSeed < 2) {
                        $attachStatus( self::ORDER_PAST_STATUSES[$pastSeed] );
                    }
                }
            }
        }
    }
}

答案 3 :(得分:0)

不要用循环来做它当你需要稍后进行更改时,它将成为一场噩梦。避免嵌套ifs的常见做法是使用早期退出&#39;

我还删除了一些不必要的变量,并为set_at属性提取了一个变量,以提高可读性。如果代码位于循环内,请不要忘记将return替换为continue

您还可以在种子类中使用私有方法,以提高可读性。

$params = ['set_at' => $beginTime->add($int)->format('Y-m-d H:i:s')];

// Downloaded in store
if (rand(0, 2) != 2) return;
$o->statuses()->attach(OrderStatusName::STATUS_DOWNLOADED_IN_STORE, $params);

// Operating in warehouse
if (rand(0, 2) != 1) return;
$o->statuses()->attach(OrderStatusName::STATUS_OPERATING_IN_WAREHOUSE, $params);

// Completed in warehouse
if (rand(0, 2) != 2) return;
$o->statuses()->attach(OrderStatusName::STATUS_COMPLETED_IN_WAREHOUSE, $params);

// In track
if (rand(0, 2) != 2) return;
$o->statuses()->attach(OrderStatusName::STATUS_IN_TRACK, $params);

// Delivered to store
if (rand(0, 2) != 2) return;
$o->statuses()->attach(OrderStatusName::STATUS_DELIVERED_TO_STORE, $params);

// Past status
$pastSeed = rand(0, 3);
if ($pastSeed != 3) return;
$o->statuses()->attach(self::ORDER_PAST_STATUSES[$pastSeed], $params);