2016-04-18 5 views
0

Does Laravel whereметод сбора изменить коллекцию?Метод Laravel 'where' изменяет коллекцию

На Laravel documentation вы можете прочитать:

почти каждый метод возвращает новый экземпляр коллекции, что позволяет сохранить первоначальную копию коллекции

И единственными методами, которые имеют предупреждение об изменении коллекции являются transform и forget

Но у меня есть этот код:

$descriptions = Description::where('description', $request->description); 

    if ($descriptions->count()) { 
     $descriptionsWithSameUnit = $descriptions->where('unit_id', $request->unit); 
     if ($descriptionsWithSameUnit->count()==0) { 
      $descriptionsWithAnotherUnit = $descriptions->where('unit_id', '!=', $request->unit); 
      if ($descriptionsWithAnotherUnit->count()) { 
     ... 

И коллекция была изменена после того, как первый, где так $descriptionsWithAnotherUnit всегда пусто, потому что на тот момент коллекция имеет только записи, где unit_id == $request->unit. Является ли это ошибкой в ​​рамках или в документации?

И вопрос, который возникает здесь: Что можно сделать, чтобы сохранить копию исходного объекта без повторного получения из БД? Я попытался это:

$descriptions = Description::where('description', $request->description); 

if ($descriptions->count()) { 
    $descriptionsWithSameUnit = $descriptions; 
    $descriptionsWithSameUnit->where('unit_id', $request->unit); 
    ... 

Но объект $descriptions также изменяется, если применить метод where к $descriptionsWithSameUnit объекта

ответ

1

Первое состоит в том, что для получения коллекции вы должны использовать get, так что если вам хотите получить коллекцию, вы должны сделать:

$descriptions = Description::where('description', $request->description)->get(); 

и не только:

$descriptions = Description::where('description', $request->description); 

Вторая вещь в том, что есть нет возможности использовать оператор с помощью where method на коллекции, так:

$descriptionsWithAnotherUnit = $descriptions->where('unit_id', '!=', $request->unit); 

совершенно неправильно. Здесь вы должны использовать метод filter.

+0

Aaaahhh теперь я понимаю, я использую Eloquent, где метод, а не коллекция. Черт, я этого не видел. –

+0

@ MariaVilaró Нет проблем. Те методы, которые вы видите, не такие, как для Eloquent –

Смежные вопросы