@hollanditkzn

Как можно построить запрос с индексом?

Мне бы хорошо бы чтобы индекс фиксировал магазин, но получается что когда в запросе делаешь indexby то туда попадает всего лишь одна запись у данного магазина и это последняя, но как сделать так чтобы было по другому и туда попадали все данные из этого магазина?
Вот запрос который я построил
$query = Shifts::find()->with('shop')->andWhere(['between', 'date', date('Y-m-d', strtotime('last Monday')), date('Y-m-d', strtotime('Sunday'))])->indexBy(['shop.name'])->all();

Получается вот что
public 'query' => 
    array (size=1)
      'Сибирский тракст' => 
        object(app\models\Shifts)[153]
          private '_attributes' (yii\db\BaseActiveRecord) => 
            array (size=8)
              'id' => int 34
              'user_id' => int 5
              'shop_id' => int 1
              'date' => string '2018-03-20' (length=10)
              'start_time' => string '08:10:00' (length=8)
              'end_time' => string '18:15:00' (length=8)
              'created_at' => string '2018-03-23 10:25:13' (length=19)
              'updated_at' => string '2018-03-23 10:25:13' (length=19)

Сейчас примерную модель чего я хочу получить для даглядности
query => [
  'Сибирский тракт' => [
      [ 
             'id' => int 34
              'user_id' => int 5
              'shop_id' => int 1
              'date' => string '2018-03-20' (length=10)
              'start_time' => string '08:10:00' (length=8)
              'end_time' => string '18:15:00' (length=8)
              'created_at' => string '2018-03-23 10:25:13' (length=19)
              'updated_at' => string '2018-03-23 10:25:13' (length=19)
     ],
      [ 
             'id' => int 35
              'user_id' => int 6
              'shop_id' => int 1
              'date' => string '2018-03-20' (length=10)
              'start_time' => string '08:10:00' (length=8)
              'end_time' => string '18:15:00' (length=8)
              'created_at' => string '2018-03-23 10:25:13' (length=19)
              'updated_at' => string '2018-03-23 10:25:13' (length=19)
     ],
      [ 
             'id' => int 36
              'user_id' => int 8
              'shop_id' => int 1
              'date' => string '2018-03-20' (length=10)
              'start_time' => string '08:10:00' (length=8)
              'end_time' => string '18:15:00' (length=8)
              'created_at' => string '2018-03-23 10:25:13' (length=19)
              'updated_at' => string '2018-03-23 10:25:13' (length=19)
     ],
//и тд
  ]
]
  • Вопрос задан
  • 84 просмотра
Пригласить эксперта
Ответы на вопрос 1
Из исходников применения indexBy:
/**
     * Converts the raw query results into the format as specified by this query.
     * This method is internally used to convert the data fetched from database
     * into the format as required by this query.
     * @param array $rows the raw query result from database
     * @return array the converted query result
     */
    public function populate($rows)
    {
        if ($this->indexBy === null) {
            return $rows;
        }
        $result = [];
        foreach ($rows as $row) {
            $result[ArrayHelper::getValue($row, $this->indexBy)] = $row;
        }

        return $result;
    }

Поэтому в данном случае можно воспользоваться ArrayHelper::index, он умеет делать, то что требуется.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы