@DarkByte2015

Where relation?

У меня есть такая модель:

/**
 * @property int $id
 * @property int $article_id
 * @property int $amount
 * @property int $created_at
 * @property int $updated_at
 *
 * @property-read Article $article
 * @property-read PaymentFile[] $files
 * @property-read bool $isCompleted
 */
class ArticlePayment extends ActiveRecord {
	public static function tableName() {
        return '{{%article_payment}}';
    }
	
    public function getArticle() {
        return $this->hasOne(Article::class, ['id' => 'article_id']);
    }

    public function getFiles() {
        return $this->hasMany(PaymentFile::class, ['payment_id' => 'id'])->where(['is_deleted' => false]);
    }

    public function getIsCompleted() {
        return $this->getFiles()->select('count(id) > 0')->groupBy('id')->having('count(id) > 0')->asArray();
    }
}


Я хочу добавить свойство isCompleted, но не знаю как это правильно сделать... Сейчас свойство isCompleted возвращает массив массивов с одним элементом вида ['count(id) > 0' => '1'], вместо bool как мне надо. К тому же мне надо чтобы я мог использовать это свойство в where запросах. Например:

$article->getPayments()->where(['isCompleted' => true]);


Но ОРМ не преобразует это свойство в подзапрос в данном случае. Пытается просто найти столбец с таким именем, а его нет.
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
@DarkByte2015 Автор вопроса
Нашел решение

public function getFilesAggregation() {
	return $this->getFiles()
		->alias('f')
		->select(['isCompleted' => 'count(f.id) > 0'])
		->groupBy('f.id')
		->having('count(f.id) > 0')
		->asArray();
}

public function getIsCompleted() {
	return $this->isNewRecord ? false : (bool)$this->filesAggregation[0]['isCompleted'];
}


Можно даже в подзапросе использовать:

$article->getPayments()->joinWith('filesAggregation');
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Arik
1. Может вместо select попробовать count? или просто селект с лимитом 1? тогда если есть хотя бы одна запись то true
2.
Тонкая настройка классов Query создаем метод isCompleted() и добавляем нужные условия
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы