Страница 1 из 1

Выборка после hasMany viaTable

Добавлено: 2018.03.29, 05:07
Alert230
Всем добра.
нужен совет по реализации/оптимизации. Код сильно упрощён, но это не важно.
Есть 2 класса

Код: Выделить всё

class PostModel extends \yii\db\ActiveRecord {
	public $id;
	public $topic_id;
	public $status;
	public function getCount() {};
}

Код: Выделить всё

class ItemModel extends \yii\db\ActiveRecord {
	public $image;
	public function getPosts() {
        return $this->hasMany(PostModel::className(),['id'=>'post_id'])
            ->viaTable('items_posts', ['item_id' => 'id']);
    }
}
Мне нужно получить посты от итема. Но не полный список, а только где $post->status = 1
Сейчас я делаю примерно так:

Код: Выделить всё

    foreach ($item->posts as $key=>$post) {
        if ($post->status== 1) {
            $posrArr[] = $post;
        }
}        
$postArr - наш искомый массив объектов. Я понимаю, что это нерационально. Как мне упростить код, избежать лишних вызовов sql? Может быть возможна какая нибудь конструкция из ActiveQuery ?
Спасибо.

Re: Выборка после hasMany viaTable

Добавлено: 2018.03.29, 07:40
yiijeka

Код: Выделить всё

$postsModels = $item->getPosts()
     ->andWhere([Post::tableName(). '.status'=>1])
     ->all();
     
foreach ($postsModels as $key => $post) {        
     $post;
}

Re: Выборка после hasMany viaTable

Добавлено: 2018.03.29, 07:56
Alert230
Большое спасибо.