yii2 active record сложные запросы

199
12 февраля 2018, 04:52

Есть таблица анкет(polls). Polls относится к одному заказу(orders) и связано с ним по полю order_id. Кроме этого у анкеты есть пару видов оценок. Эти оценки хранятся в таблице scores, где в поле poll_id указана id анкеты, в поле type указывается тип оценки, в поле score значение оценки. Заказ(orders) может быть выполнен только одним филиалом, с таблицей филиалов(filials) связь по полю filial_id. Также заказ принадлежит только одному клиенту(таблица clients), связь по полю client_id. Выводятся следующие данные по анкетам

  • Типы оценок и соответствующие им значения
  • Название филиала
  • Дата анкеты(поле Polls.created)
  • Телефон клиента(clients.phone)

С выводом общего списка анкет я справился. Использовал следующий запрос:

$polls = Poll::find()
            ->where(['status_id'=>7])
            ->with('scores','scoreDishes','order.client','order.filial')
            ->orderBy(['created' => SORT_DESC])
            ->all(); 

Для этого я указал связи для модели Poll:

public function getOrder() {
       return $this->hasOne(Order::className(), ['id' => 'order_id']);
    }
    public function getScores() {
       return $this->hasMany(Score::className(), ['poll_id' => 'id']);
    }
    public function getScoreDishes() {
       return $this->hasMany(ScoreDish::className(), ['poll_id' => 'id']);
    }

Для модели Order:

public function getFilial() {
       return $this->hasOne(Filial::className(), ['id' => 'filial_id']);
    }
    public function getClient() {
       return $this->hasOne(Client::className(), ['id' => 'client_id']);
    }

Но теперь проблема с фильтрацией данных. Как нужно изменить запросы, чтобы получить только те анкеты, которые относятся к заказам, которые выполнены конкретным филиалом. То есть те строки, где поле filial_id у таблицы orders равно например 2. Структура таблиц:

CREATE TABLE `polls` (
  `id` int(11) NOT NULL,
  `email_id` int(11) DEFAULT NULL,
  `status_id` int(11) NOT NULL,
  `created` datetime NOT NULL,
  `updated` datetime NOT NULL,
  `order_id` int(11) NOT NULL,
  `key` varchar(255) NOT NULL,
  `comment` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `scores` (
  `id` int(11) NOT NULL,
  `poll_id` int(11) NOT NULL,
  `type_code` varchar(255) NOT NULL,
  `score` int(11) NOT NULL,
  `comment` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `score_dishes` (
  `id` int(11) NOT NULL,
  `poll_id` int(11) NOT NULL,
  `dish_id` int(11) NOT NULL,
  `score` int(11) NOT NULL,
  `comment` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL,
  `order_number` varchar(255) NOT NULL,
  `filial_id` int(11) NOT NULL,
  `driver_id` int(11) NOT NULL,
  `operator_id` int(11) NOT NULL,
  `client_id` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE `filials` (
  `id` int(11) NOT NULL,
  `crm_id` varchar(255) DEFAULT NULL,
  `name` varchar(255) NOT NULL,
  `is_active` tinyint(1) NOT NULL DEFAULT '1'
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE `clients` (
  `id` int(11) NOT NULL,
  `phone` varchar(255) DEFAULT NULL,
  `name` varchar(255) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
READ ALSO
Предикат для find_if

Предикат для find_if

Как можно создать предикат с двумя параметрами на входеНапример

211
SetWindowsHookEx + WH_CBT работает не так как должен

SetWindowsHookEx + WH_CBT работает не так как должен

Есть 2 подобные функции для установки хука для 64 и 32 - битных приложений:

284
Как установить шаблон win32 для Visual Studio?

Как установить шаблон win32 для Visual Studio?

Хочу начать знакомство с формами, но не могу установить необходимы шаблонОблазил уже весь инсталлер, не вижу ничего похожего

256