Yii2 ActiveQuery использовать ИЛИ в массиве ссылок

Я хочу использовать оператор ИЛИ в $link массив в hasMany функция в классе расширена ActiceRecord.
Например, я хочу получить транзакции, связанные с учетной записью пользователя. В sql это было бы что-то вроде SELECT * FROM transactions WHERE fromAccountId = :id OR toAccountId = :id Но как я могу написать это с помощью Yii2

    public function getTransactions() {
return $this->hasMany(Transaction::className(), [
'fromAccountId' => 'id',
'toAccountId' => 'id'
]);
}

4

Решение

Ссылка ActiveQuery работает с ключами массива в качестве имени столбца, а значения — в качестве значения столбца.

Ключи массива должны быть столбцами таблицы для этого отношения, а значения массива должны быть соответствующими столбцами из первичной таблицы.

Потому что код не работает (where (fromAccountId, toAccountId) IN ('id','id')):

[
'fromAccountId' => 'id',
'toAccountId' => 'id'
]

Вы можете переписать поведение hasMany в getTransactions ()

public function getTransactions() {
$query = Transaction::find();
$query->multiple = true;
return $query->where(['OR',
['fromAccountId' => $this->id],
['toAccountId' => $this->id]
]);
}

Как и ожидалось, он поддерживает нативное поведение:

$model->getTransactions() // return as \yii\db\ActiveQuery
$model->transactions // return as array of Transactions models

Но не работает для $model->find()->with('transactions'), так как with требовать настройки $query->link, Вместо with нужно использовать join....

3

Другие решения

Вы можете использовать find (), это не так хорошо, но сделайте работу:

return $this->find()->join('LEFT JOIN', 'transaction', 'fromAccountId = id OR toAccountId = id')->all();

Может быть, вы должны использовать tablename.id!

0

Я не пробовал это, но вы могли бы попробовать что-то вроде

public function getTransactions() {
return $this->hasMany(Transaction::className(), ['1' => '1'])->where('fromAccountId = id OR toAccountId = id');
}

Идея состоит в том, чтобы создать соединение без условия (или с фиктивным условием), а затем использовать, где получить фактические результаты, которые вы хотите. Это может означать огромную проблему с производительностью.

-2
По вопросам рекламы [email protected]