Active Record, limit и вложенные связи

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Active Record, limit и вложенные связи

Сообщение sda »

Есть связь Customer и Order один ко многим
Есть связь Order и Item один ко многим

Я хочу выбрать объект Customer и его 10 объектов Order, а у каждого выбранного объекта Order я хочу выбрать по 10 объектов Item. Как это можно сделать в Yii ? Можно пример? В доках не нашел.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Active Record, limit и вложенные связи

Сообщение caHek2x »

limit ...
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Active Record, limit и вложенные связи

Сообщение sda »

Не понял? Я хочу указать limit для реляций в момент выборки Customer. По докам ясно, как это можно сделать для реляции первого уровня, а как сделать для вложенных реляций непонятно. Хочу понять умеет это делать фреймворк или нет.

Код: Выделить всё

$customers = Customer::find()->with('orders.items')->all();
 
Хочу чтобы этот запрос возвращал 10 orders и у каждого order возвращал по 10 items. Причем limit хочу указать именно в запросе (не в модели). Как это сделать?
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Active Record, limit и вложенные связи

Сообщение caHek2x »

когда советовал думал чтоб вы добавили или в модель или в анонимную ф-цию

Код: Выделить всё

        $query = Products::find();
        $query->with(['configs'=>function($query){
            $query->limit(2);
        }]);
        $query->all(); 
... но протестировав понял что не получится никак ...
т.к. выборка идет массово для всех Customer через in ...
только если вытаскивать для каждого по отдельности ...
По докам ясно, как это можно сделать для реляции первого уровня
я даже такого решения не вижу ... поделитесь ?
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Active Record, limit и вложенные связи

Сообщение sda »

я даже такого решения не вижу ... поделитесь ?
Я думал, что через анонимную функцию можно сделать лимит для реляции первого уровня. Но сейчас, когда вы написали, понял, что для реляций невозможно сделать limit в текущей реализации ORM.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Active Record, limit и вложенные связи

Сообщение caHek2x »

поэтому если у вас 5 Customer и 100000 orders тогда лучше доставать отдельными запросами ...
а если не так уже много orders то просто при выводе выводите последние 10 ... а запрос пусть уже все достает ...
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Active Record, limit и вложенные связи

Сообщение Loveorigami »

Могу ошибаться, а не пробовали в самом relation указать лимит и с ним потом делать связь

Код: Выделить всё

public function getItems(){
    return $this->hasMany(Order::className(), ['id'=>'order_id']);
  }
  
public function getItemsLimit($count = 10){
    return $this->getItems()->limit($count)
  }
 

Код: Выделить всё

$customers = Customer::find()->with('orders.itemsLimit')->all();
Последний раз редактировалось Loveorigami 2016.11.16, 16:24, всего редактировалось 2 раза.
zelenin
Сообщения: 10596
Зарегистрирован: 2013.04.20, 11:30

Re: Active Record, limit и вложенные связи

Сообщение zelenin »

Loveorigami писал(а):Могу ошибаться, а не пробовали в самом relation указать лимит и с ним потом делать связь

Код: Выделить всё

public function getItemsLimit($count = 100){
    return $this->hasMany(Order::className(), ['id'=>'order_id'])
      ->limit($count)
  }

Код: Выделить всё

$customers = Customer::find()->with('orders.itemsLimit')->all();
прочтите ветку. в ней есть утверждения, что: а) такой способ не работает, б) такой способ не подходит.
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Active Record, limit и вложенные связи

Сообщение caHek2x »

Loveorigami писал(а):Могу ошибаться, а не пробовали в самом relation указать лимит и с ним потом делать связь

Код: Выделить всё

public function getItemsLimit($count = 10){
    return $this->hasMany(Order::className(), ['id'=>'order_id'])
      ->limit($count)
  } 

Код: Выделить всё

$customers = Customer::find()->with('orders.itemsLimit')->all(); 
я сам почемуто не подумал логически когда давал первый ответ .. .такой способ работает но только НЕ в with ... а если по одному ...

наглядно:
у вас есть users и orders ...
когда вы сделаете Users::find()->with('orders')->all()
у вас будет доставаться select * from orders where user_id in (1,2,3,4,5,6,7) limit 10 и ваш лимит отлимитит не для каждого по 10 .. а для всех 10 штук ...
sda
Сообщения: 334
Зарегистрирован: 2013.12.19, 09:29

Re: Active Record, limit и вложенные связи

Сообщение sda »

caHek2x, я хотел подсмотреть реализацию этой фичи в yii, чтобы взять в свою простенькую data mapper orm на nodejs под монго. Я хочу собирать доменные объекты Customer и я не хочу собирать их руками, я хочу, чтобы это делала за меня orm. Я лишь хочу сказать, с какими зависимостями и в каком количестве.
Morr123
Сообщения: 22
Зарегистрирован: 2016.06.13, 16:39

Re: Active Record, limit и вложенные связи

Сообщение Morr123 »

В яндексе первый результат, есть ответ на вопрос http://web-sprints.ru/yii2-activerecord-model/
caHek2x
Сообщения: 1240
Зарегистрирован: 2016.04.12, 20:41

Re: Active Record, limit и вложенные связи

Сообщение caHek2x »

Morr123 писал(а):В яндексе первый результат, есть ответ на вопрос http://web-sprints.ru/yii2-activerecord-model/
это вообще к чему ? вы наверно не поняли что хочет ТС
Paulius22
Сообщения: 16
Зарегистрирован: 2017.07.19, 13:29

Re: Active Record, limit и вложенные связи

Сообщение Paulius22 »

У меня та же проблема, нужно сделать limit(2), иначе получает несколько тысяч записей, на хостинге иногда даже памяти не хватает.
Как-то можно это решить средствами yii2?
andku83
Сообщения: 988
Зарегистрирован: 2016.07.01, 10:24
Откуда: Харьков

Re: Active Record, limit и вложенные связи

Сообщение andku83 »

sda писал(а): 2016.11.16, 13:40 ... По докам ясно, как это можно сделать для реляции первого уровня, а как сделать для вложенных реляций непонятно. ...
Для вложенных реляций точно так же как и для реляций первого уровня.
А по поводу лимита давно пытался такое сделать, но ничего не получилось.
Ответить