zelenin писал(а): ↑2016.12.16, 18:03
только ручками
появилось время, решил вернуться к данному вопросу ...
Решение моего вопроса:
https://yadi.sk/d/wzrHNuZK39dvUj
сделал, работает. во всяком случае на том что я протестировал все отлично.
Суть такая:
есть модель или массив моделей. Надо сделать жадную выборку каких-то связей
например есть массив моделей специальностей операторов
Код: Выделить всё
$models = Specialty::find()->limit(5)->all();
надо жадно загрузить операторов, операторы привязаны:
Код: Выделить всё
public function getOpers()
{
return $this->hasMany(Opers::className(), ['oper_id' => 'oper_id'])
->viaTable(OpersSpecialtyLink::tableName(), ['specialty_id' => 'specialty_id']);
}
(да я понимаю что можно запросу дописать with, но суть именно в том что вот есть модели без with ... и надо прогрузить связи жадно ...)
моя ф-ция:
или например
Код: Выделить всё
ModelHelper::loadWith($models, ['opers.permission']);
ф-ция loadWith сделает два запрос:
Код: Выделить всё
SELECT `specialty_id`, `oper_id` FROM `opers_specialty_link` WHERE specialty_id in (-1,2,4,5,6)
и
Код: Выделить всё
SELECT * FROM `opers` WHERE oper_id in (10,14,115,287,8,71,196,268,292,279,317,333,339,356,134,337,340,348,306,236,234,82,235,238,63,136,7,207,306,236,234,235,220,348,7,94,238,318,134)
и разложит все по моделям ...
если у модели уже была загружена связь - loadWith заново грузить и трогать её не будет ...
если у модели getter возвращает null то тоже трогать не будет ...
проверку на null сделал для таких целей, бывают такие связи:
Код: Выделить всё
public function getSegment()
{
if ($this->link_type == self::LINK_TYPE_SEGMENT) return $this->hasOne(MapSegments::className(), ['seg_id' => 'link_val1']);
else return null;
}
еще бы по хорошему обработать inverseOf ... но пока еще руки не дошли ...
------------------------------
может я сделал велосипед никому не нужный ... но я не нашел альтернативы для такой задачи