$query = Card::find()->joinWith('tags')->where(['tags.id' => 2])->joinWith('tags t')->where(['t.id' => 1]);tags.id = 1 и tags.id =2. Но так же карточки, в которых есть просто tags.id = 1, но без tags.id = 2. tags.id = 1, и tags.id =2, но не что-то одно. Где я свернул не туда?public function getCard()
{
return $this->hasMany(Card::className(), ['id' => 'card_id'])
->viaTable('card_tags', ['tags_id' => 'id']);
}public function getTags()
{
return $this->hasMany(Tags::className(), ['id' => 'tags_id'])
->viaTable('card_tags', ['card_id' => 'id']);
}
Card::find()->with('tags')
->joinWith(['tags' => function(ActiveQuery $query){
$query->from(['tags' => Tags::tableName()->where(['tags.id' => 2])])
}])
->joinWith('tags' => function(ActiveQuery $query){
$query->from('t' => Tags::tableName()->where(['t.id' => 1]))
}); $query = Card::find()->with('tags')
->joinWith(['tags' => function(\yii\db\ActiveQuery $query){
$query->from(['tags' => Tags::find()->where(['tags.id' => 1])]);
}])
->joinWith(['tags' => function(\yii\db\ActiveQuery $query){
$query->from(['tags' => Tags::find()->where(['tags.id' => 2])]);
}]);Database Exception – yii\db\Exception
SQLSTATE[42000]: Syntax error or access violation: 1066 Not unique table/alias: 'tags'
The SQL being executed was: SELECT COUNT(*) FROM `card` LEFT JOIN `card_tags` ON `card`.`id` = `card_tags`.`card_id` LEFT JOIN (SELECT * FROM `tags` WHERE `tags`.`id`=1) `tags` ON `card_tags`.`tags_id` = `tags`.`id` LEFT JOIN (SELECT * FROM `tags` WHERE `tags`.`id`=2) `tags` ON `card_tags`.`tags_id` = `tags`.`id` Card::find()->with('tags')
->joinWith(['tags' => function(\yii\db\ActiveQuery $query){
$query->from(['tags' => Tags::find()->where(['tags.id' => 1])]);
}])
->joinWith(['tags' => function(\yii\db\ActiveQuery $query){
$query->from(['t' => Tags::find()->where(['t.id' => 2])]);
}]);SQLSTATE[42S22]: Column not found: 1054 Unknown column 't.id' in 'where clause'
The SQL being executed was: SELECT COUNT(*) FROM `card` LEFT JOIN `card_tags` ON `card`.`id` = `card_tags`.`card_id` LEFT JOIN (SELECT * FROM `tags` WHERE `tags`.`id`=1) `tags` ON `card_tags`.`tags_id` = `tags`.`id` LEFT JOIN (SELECT * FROM `tags` WHERE `t`.`id`=1) `t` ON `card_tags`.`tags_id` = `t`.`id`public function getCard()
{
return $this->hasMany(Card::className(), ['id' => 'card_id'])
->viaTable('card_tags', ['tags_id' => 'id']);
}public function getTags()
{
return $this->hasMany(Tags::className(), ['id' => 'tags_id'])
->viaTable('card_tags', ['card_id' => 'id']);
} class CardTags extends \yii\db\ActiveRecord
{
/**
* @inheritdoc
*/
public static function tableName()
{
return 'card_tags';
}
/**
* @inheritdoc
*/
public function rules()
{
return [
[['card_id', 'tags_id'], 'integer'],
];
}
/**
* @inheritdoc
*/
public function attributeLabels()
{
return [
'id' => 'ID',
'card_id' => 'Card ID',
'tags_id' => 'Tags ID',
];
}
} Card::find()
->leftJoin('card_tags t1', 't1.card_id = card.id')
->leftJoin('card_tags t2', 't2.card_id = card.id')
->where([
'and',
['t1.tags_id' => 1],
['t2.tags_id' => 2]
]); public function issetTags($tagIds = [])
{
if (empty($tagIds) || !is_array($tagIds)) {
return $this;
}
foreach ($tagIds as $tagId) {
$this->leftJoin("card_tags t{$tagId}", "t{$tagId}.card_id = catd.id");
$this->andWhere(["t{$tagId}.tags_id" => $tagId]);
}
return $this;
}select ct.card_id, count(ct.card_id) as count from card_id ct
where ct.tags_id in (1,2)
group by ct.card_id
having count = 2