Я хочу использовать оператор ИЛИ в $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'
]);
}
Ссылка 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....
Вы можете использовать find (), это не так хорошо, но сделайте работу:
return $this->find()->join('LEFT JOIN', 'transaction', 'fromAccountId = id OR toAccountId = id')->all();
Может быть, вы должны использовать tablename.id!
Я не пробовал это, но вы могли бы попробовать что-то вроде
public function getTransactions() {
return $this->hasMany(Transaction::className(), ['1' => '1'])->where('fromAccountId = id OR toAccountId = id');
}
Идея состоит в том, чтобы создать соединение без условия (или с фиктивным условием), а затем использовать, где получить фактические результаты, которые вы хотите. Это может означать огромную проблему с производительностью.