Модификация получаемых из ОРМ массивов данных

 

Очень часто в Laravel нужно получить нестандартную структуру массива данных из БД (ORM Eloquent) для удобства их дальнейшей обработки или вывода в пользовательской части в определенном формате.

Один из таких примеров - это необходимость получить массив с ключами, пронумерованными по id элементов (например ключ - id товара, значение - наименование товара). Получить такой массив очень просто.

Пример:

    //код можно разместить, к примеру, в любом контроллере
    
    //в функцию keyBy() вставляется значение ORM,
   //которое будет записано в ключи массива получаемых данных
    $products = Product::all('id','name')->keyBy('id'); 
  

В результате получим нужный нам массив со значениями ключей из id товаров

     1 => App\Models\Prop {
           #attributes: [
             "id" => 1
             "name" => "Какой-то там товар"
           ]
     }
     4 => App\Models\Prop {
           #attributes: [
             "id" => 4
             "name" => "Другой товар"
           ]
     }
  

Часто требуется получить простейший массив со списком ID наименований, которые в дальнейшем нужно включить или исключить из выборки в запросе.

К примеру, нужно удалить одним запросом список товаров, которые относятся к категориями со следующими id: 2,6,7,9 (товары только из неактивных категорий). Эти ID предварительно нужно получить другим запросом из таблицы категорий. Делается это просто:

    //код можно разместить, к примеру, в любом контроллере
    
    //задаем простой массив значений
    $mass = [2,6,7,9];

    //Удаляем товары у которых столбец cat_id имеет 
    //значения из заданного массива
    $products = Product::select('id')->whereIn('cat_id', $mass)->delete();; 

    //Если требуется обратная операция удаления товаров, 
    //не имеющих значения из массива
    $products = Product::select('id')->whereNotIn('cat_id', $mass)->delete();

    //выше массив $mass задавался вручную
    //чтобы получить аналогичный массив из бд
    $mass = Cat::select('id')->where('cat.is_active', '=', '0')
      ->pluck('products.id')->toArray();
  

Конечно описанную выше задачу можно решить гораздо проще и одним запросом. Здесь пример приведен для ознакомления с возможностями получения и обработки массивов в удобном виде.

Кейсы