src/models/MessageSearch.php
<?php namespace bizley\podium\models; use bizley\podium\db\Query;use Yii;use yii\data\ActiveDataProvider; /** * MessageSearch model * * @author Paweł Bizley Brzozowski <pawel@positive.codes> * @since 0.1 */class MessageSearch extends Message{ /** * @var string Receiver name. */ public $receiverName; /** * @inheritdoc */ public function rules() { return [ [['receiverName', 'topic'], 'string'], ]; } /** * Searches for sent messages. * @param array $params * @return ActiveDataProvider */Method `search` has 62 lines of code (exceeds 25 allowed). Consider refactoring. public function search($params) { $subquery = (new Query()) ->select(['m2.replyto']) ->from(['m1' => Message::tableName()]) ->leftJoin(['m2' => Message::tableName()], 'm1.replyto = m2.id') ->where(['is not', 'm2.replyto', null]); $query = static::find()->where(['and', [ 'sender_id' => User::loggedId(), 'sender_status' => Message::getSentStatuses() ], ['not in', Message::tableName() . '.id', $subquery] ]); $dataProvider = new ActiveDataProvider([ 'query' => $query, 'sort' => [ 'attributes' => ['id', 'topic', 'created_at'], ], ]); $dataProvider->sort->defaultOrder = ['id' => SORT_DESC]; $dataProvider->pagination->pageSize = Yii::$app->session->get('per-page', 20); if (!($this->load($params) && $this->validate())) { $dataProvider->query->joinWith(['messageReceivers' => function ($q) { $q->joinWith(['receiver']); }]); return $dataProvider; } $dataProvider->query->andFilterWhere(['like', 'topic', $this->topic]); Similar blocks of code found in 2 locations. Consider refactoring. if (preg_match('/^(forum|orum|rum|um|m)?#([0-9]+)$/', strtolower($this->receiverName), $matches)) { $dataProvider->query->joinWith(['messageReceivers' => function($q) use ($matches) { $q->joinWith(['receiver' => function ($q) use ($matches) { $q->andFilterWhere(['and', [User::tableName() . '.id' => $matches[2]], ['or', ['username' => ''], ['username' => null] ] ]); }]); }]); } elseif (preg_match('/^([0-9]+)$/', $this->receiverName, $matches)) { $dataProvider->query->joinWith(['messageReceivers' => function($q) use ($matches) { $q->joinWith(['receiver' => function ($q) use ($matches) { $q->andFilterWhere(['or', ['like', 'username', $this->receiverName], ['and', ['id' => $matches[1]], ['or', ['username' => ''], ['username' => null] ] ], ]); }]); }]); } else { $dataProvider->query->joinWith(['messageReceivers' => function($q) { $q->joinWith(['receiver' => function ($q) { $q->andFilterWhere(['like', User::tableName() . '.username', $this->receiverName]); }]); }]); } return $dataProvider; }}