Страница 1 из 1

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

Добавлено: 2016.11.16, 13:18
sda
Есть связь Customer и Order один ко многим
Есть связь Order и Item один ко многим

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

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

Добавлено: 2016.11.16, 13:22
caHek2x
limit ...

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

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

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

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

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

Добавлено: 2016.11.16, 15:12
caHek2x
когда советовал думал чтоб вы добавили или в модель или в анонимную ф-цию

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

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

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

Добавлено: 2016.11.16, 15:35
sda
я даже такого решения не вижу ... поделитесь ?
Я думал, что через анонимную функцию можно сделать лимит для реляции первого уровня. Но сейчас, когда вы написали, понял, что для реляций невозможно сделать limit в текущей реализации ORM.

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

Добавлено: 2016.11.16, 15:55
caHek2x
поэтому если у вас 5 Customer и 100000 orders тогда лучше доставать отдельными запросами ...
а если не так уже много orders то просто при выводе выводите последние 10 ... а запрос пусть уже все достает ...

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

Добавлено: 2016.11.16, 16:20
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();

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

Добавлено: 2016.11.16, 16:22
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();
прочтите ветку. в ней есть утверждения, что: а) такой способ не работает, б) такой способ не подходит.

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

Добавлено: 2016.11.16, 16:26
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 штук ...

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

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

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

Добавлено: 2016.11.16, 23:21
Morr123
В яндексе первый результат, есть ответ на вопрос http://web-sprints.ru/yii2-activerecord-model/

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

Добавлено: 2016.11.16, 23:55
caHek2x
Morr123 писал(а):В яндексе первый результат, есть ответ на вопрос http://web-sprints.ru/yii2-activerecord-model/
это вообще к чему ? вы наверно не поняли что хочет ТС

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

Добавлено: 2018.04.25, 09:24
Paulius22
У меня та же проблема, нужно сделать limit(2), иначе получает несколько тысяч записей, на хостинге иногда даже памяти не хватает.
Как-то можно это решить средствами yii2?

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

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