myks92
@myks92
Нашёл решение — пометь вопрос ответом!

Yii Search Model — как сделать поиск по нескольким полям?

Быстро нигде не мог найти поиск по нескольким полям. Подскажите, пожалуйста, что я не так сделал? Мне нужно из одной формы отфильтровать запрос. В данном случае нужно найти человека по фамилии имени (fullName). Если вводить имя или фамилию отдельно — всё работает. А если есть пробел - запрос прекращается.

public $fullName;

[['fullName'], safe]
....
/**
         * Настройка параметров сортировки
         * Важно: должна быть выполнена раньше $this->load($params)
         */
        $dataProvider->setSort([
            'attributes' => [
                'id',
                'fullName' => [
                    'asc' => ['last_name' => SORT_ASC, 'name' => SORT_ASC],
                    'desc' => ['last_name' => SORT_DESC, 'name' => SORT_DESC],
                    'label' => 'Full Name',
                    'default' => SORT_ASC
                ],
                'country_id'
            ]
        ]);
....
$query->andFilterWhere(['like', 'last_name', $this->fullName])
            ->orFilterWhere(['like', 'name', $this->fullName])
            ->orFilterWhere(['like', 'middle_name', $this->fullName]);
  • Вопрос задан
  • 1943 просмотра
Решения вопроса 1
myks92
@myks92 Автор вопроса, куратор тега Yii
Нашёл решение — пометь вопрос ответом!
Решение может быть таким, используя "CONCAT_WS":

$query = new Query();
            $query->select(['profile.user_id as id, CONCAT_WS(" ", profile.last_name, profile.name, profile.middle_name) AS text'])
                ->from('profile')
                ->leftJoin('user','profile.user_id = user.id','user.id = 10')
                ->leftJoin('auth_assignment','auth_assignment.user_id = profile.user_id')
                ->where('CONCAT_WS(" ", last_name, name, middle_name) LIKE :search')
                ->params([':search' => '%' . $search . '%'])
                ->orderBy(['last_name' => 'SORT_ASC', 'name' => 'SORT_ASC', 'middle_name' => 'SORT_ASC'])
                ->andWhere(['auth_assignment.item_name'=>'organizer'])
                ->andWhere(['user.status'=>\common\models\User::STATUS_ACTIVE])
                ->limit(20);
            $command = $query->createCommand();
            $data = $command->queryAll();
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
ilyachase
@ilyachase
web-developer
Предположительно, необходимо $this->fullName разбивать по пробелу и получать имя, фамилию и отчество отдельно.
Запрос не работает, т.к. в последних строках $this->fullName подставляется во все три поля в like.
Но просто разбивать по пробелу введенную строку не совсем корректно - слишком много степеней свободы (например, вы же не знаете, в каком порядке пользователь ввел имя и фамилию, сколько полей он ввел, а если слово всего одно - имя это или фамилия и т.д.). Следовательно, в форме под эти цели нужно сделать три различных поля и данные с каждого из них подставлять в запрос по отдельности.
Ответ написан
Ваш ответ на вопрос

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

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