Ломтик ларавеллы в коллекции - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть этот код в моем контроллере Laravel 5.6:

$ads = Advertisement::actives();

$ports = Port::filter($filters)
    ->actives()
    ->paginate(28);

Я бы хотел добавить к каждому 4th порту одну рекламу. Как я мог это сделать?

Итак, результат должен быть:

//Collection
[
   //Port,
   //Port,
   //Port,
   //Port
   //Advertisement
   //Port
   //Port
   //Port
   //Port
   //Advertisement

   //etc...
]

Ответы [ 3 ]

0 голосов
/ 11 сентября 2018

Вы можете объединить в коллекцию, как массив.

Что-то вроде ...

  $ads = collect(['ad1','ad2','ad3','ad4']);

  $ports = collect([
    "port 1",
    "port 2",
    "port 3",
    "port 4",
    "port 5",
    "port 6",
    "port 7",
    "port 8",
    "port 9",
    "port10",
    "port11"
  ]);


  for($i=4; $i<=$ports->count(); $i+=5) {

    $ports->splice($i, 0, $ads->shift());

  }

  // tack on the remaining $ads at the end
  // (I didn't check if there actually are any).

  $everyone=$ports->concat($ads);

  dd($everyone);

Производит ...

Collection {#480 ▼
  #items: array:15 [▼
    0 => "port 1"
    1 => "port 2"
    2 => "port 3"
    3 => "port 4"
    4 => "ad1"
    5 => "port 5"
    6 => "port 6"
    7 => "port 7"
    8 => "port 8"
    9 => "ad2"
    10 => "port 9"
    11 => "port10"
    12 => "port11"
    13 => "ad3"
    14 => "ad4"
  ]  
}
0 голосов
/ 11 сентября 2018

Если каждый ваш адд содержит один и тот же код, вы можете сделать это так:

$ports = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);

$ads = 'ad';

$ports = $ports->chunk(4)->each->push($ads)->collapse();

Это даст вам:

Collection {#530 ▼
  #items: array:14 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
    4 => "ad"
    5 => 5
    6 => 6
    7 => 7
    8 => 8
    9 => "ad"
    10 => 9
    11 => 10
    12 => 11
    13 => "ad"
  ]
}

Но если в $ads у вас есть несколько объявлений, вам нужно использовать более длинную запись:

$ports = collect([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]);

$ads = ['ad1', 'ad2', 'ad3'];

$ports = $ports->chunk(4)->map(function($items, $key) use ($ads) {
    return $items->push($ads[$key]);
})->collapse();

dd($ports);

Это даст вам:

Collection {#530 ▼
  #items: array:14 [▼
    0 => 1
    1 => 2
    2 => 3
    3 => 4
    4 => "ad1"
    5 => 5
    6 => 6
    7 => 7
    8 => 8
    9 => "ad2"
    10 => 9
    11 => 10
    12 => 11
    13 => "ad3"
  ]
}

Для справки вы можете взглянуть на Коллекционная документация

0 голосов
/ 11 сентября 2018

Используйте метод chunk для извлечения фрагментов из 4 портов:

foreach ($ports->chunk(4) as $chunk) {
    // chunk will be a collection of four ports, pull however you need
    // then pull the next available ad
}
...