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

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
Alert230
Сообщения: 24
Зарегистрирован: 2018.03.09, 13:34

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

Сообщение Alert230 » 2018.03.29, 05:07

Всем добра.
нужен совет по реализации/оптимизации. Код сильно упрощён, но это не важно.
Есть 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 ?
Спасибо.

Аватара пользователя
yiijeka
Сообщения: 3031
Зарегистрирован: 2012.01.28, 09:14
Откуда: Беларусь

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

Сообщение yiijeka » 2018.03.29, 07:40

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

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

Alert230
Сообщения: 24
Зарегистрирован: 2018.03.09, 13:34

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

Сообщение Alert230 » 2018.03.29, 07:56

Большое спасибо.

Ответить