Alexum писал(а): ↑2018.05.20, 00:37
1. Сцепляются все пользователи с транзакциями, которые больше 0. Для joinWith() жадную загрузку отключаем, т.е. получим только данные по пользователям.
Код: Выделить всё
->joinWith(['transactions'],false)->where(['!=','amount',0])->with(['transactions'])
->joinWith(['transactions'])->where(['!=','amount',0])
оба варианта выше делают одно и то же.
Для того чтобы получить фильтрацию в связанных данных необходимо делать по-другому:
Код: Выделить всё
->joinWith(['transactions' => function($q) {
$q->andOnCondition(['!=','amount',0])
}])
Для того чтобы не учитывать отрицательные значения достаточно использовать " > 0".
Ну и по-моему это все не по теме вопроса, если я правильно понял то нужно получить пользователей с положительным балансом и их баланс:
добавить в модель User: public $balance; // для того чтобы модель не игнорировала данные пришедшие от БД
Код: Выделить всё
User::find()->select([User::tableName().'.*', 'balance' => new \yii\db\Expression("SUM(amount)")])
->innerJoinWith(['transactions' => function($q){
$q->andWhere(['>', 'amount', 0]) // возможно вместо `andWhere` понадбится `andOnCondition`
}], false)
если планируется работать с транзакциями то убрать false из joinWith
данные о суммарном балансе будут в $user->balance