За последние 24 часа нас посетили 56119 программистов и 1682 робота. Сейчас ищут 1274 программиста ...

Как оформить sql запрос с регуляркой в yii2

Тема в разделе "Yii", создана пользователем DS32, 22 окт 2020.

  1. DS32

    DS32 Новичок

    С нами с:
    13 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Составил sql запрос:
    PHP:
    1. 'SELECT `fio`,`city` FROM `user` WHERE `status` = 10 ORDER BY `fio` REGEXP '^[А-яа-я]' DESC, `city` DESC, `fio` REGEXP '^[A-za-z]' DESC, `fio`
    Если пишу так, то не распознает регулярку и вылетает ошибка:
    PHP:
    1. $query = User::find()
    2. ->where(['status' => User::STATUS_ACTIVE])
    3. ->orderBy('fio "REGEXP ^[А-яа-я]" DESC, city DESC, fio "REGEXP ^[A-za-z]" DESC, fio')
    4. ->ALL();
    Этот запрос использую в модели:
    PHP:
    1. namespace app\models;
    2.  
    3. use yii\base\Model;
    4. use yii\data\ActiveDataProvider;
    5. use app\models\User;
    6. use Yii;
    7.  
    8. /**
    9. * UserSearch represents the model behind the search form of `app\models\User`.
    10. */
    11. class UserSearch extends User
    12. {
    13.  
    14.  
    15.     public function rules()
    16.     {
    17.         return [
    18.             [['id', 'dnomer', 'status', 'created_at', 'updated_at'], 'integer'],
    19.             [['username', 'fio', 'img', 'city', 'mnomer', 'comp', 'dol', 'spec', 'dep', 'vbiz', 'vladbiz', 'country', 'tip', 'auth_key', 'password_hash', 'password_reset_token', 'email', 'verification_token'], 'safe'],
    20.         ];
    21.     }
    22.  
    23.     public function scenarios()
    24.     {
    25.         return Model::scenarios();
    26.     }
    27.  
    28.  
    29.     public function search($params)
    30.     {
    31.       //$sql = 'SELECT `fio`,`city` FROM `user` WHERE `status` = 10 ORDER BY `fio` REGEXP '^[А-яа-я]' DESC, `city` DESC, `fio` REGEXP '^[A-za-z]' DESC, `fio` LIMIT 450';
    32.  
    33.      $query = User::find()
    34.      ->where(['status' => User::STATUS_ACTIVE])
    35.     ->orderBy('fio "REGEXP ^[А-яа-я]" DESC, city DESC, fio "REGEXP ^[A-za-z]" DESC, fio')
    36.     ->ALL();
    37.  
    38.         $dataProvider = new ActiveDataProvider([
    39.             'query' => $query,
    40.             'pagination' => array('pageSize' => 200),
    41.          //   'sort'=> ['defaultOrder' => [
    42.           //  'fio' =>  'REGEXP ^[А-яа-я]'. SORT_ASC,
    43.           //  'city' => SORT_DESC,
    44.           //  'fio' => 'REGEXP ^[A-za-z]'. SORT_DESC,
    45.           //  ]],
    46.  
    47.         ]);
    48.         $this->load($params);
    49.  
    50.         if (!$this->validate()) {
    51.             return $dataProvider;
    52.         }
    53.  
    54.         // grid filtering conditions
    55.          $query->andFilterWhere([
    56.             'id' => $this->id,
    57.             'dnomer' => $this->dnomer,
    58.             'status' => $this->status,
    59.             'created_at' => $this->created_at,
    60.             'updated_at' => $this->updated_at,
    61.         ]);
    62.  
    63.   $query->andFilterWhere(['like', 'username', $this->username])
    64.         ->andFilterWhere(['like', 'fio', $this->fio])
    65.         ->andFilterWhere(['like', 'img', $this->img])
    66.         ->andFilterWhere(['like', 'city', $this->city])
    67.         ->andFilterWhere(['like', 'mnomer', $this->mnomer])
    68.         ->andFilterWhere(['like', 'comp', $this->comp])
    69.         ->andFilterWhere(['like', 'dol', $this->dol])
    70.         ->andFilterWhere(['or like', 'spec', $this->spec])
    71.         ->andFilterWhere(['like', 'dep', $this->dep])
    72.         ->andFilterWhere(['like', 'vbiz', $this->vbiz])
    73.         ->andFilterWhere(['like', 'vladbiz', $this->vladbiz])
    74.         ->andFilterWhere(['like', 'country', $this->country])
    75.         ->andFilterWhere(['like', 'tip', $this->tip])
    76.         ->andFilterWhere(['like', 'email', $this->email]);
    77.         return $dataProvider;
    78.     }
    79.  
    80.  
    81.  
    82. }
    Ошибка такого вида:
    PHP:
    1. Database Exception – yii\db\Exception
    2. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fio "REGEXP ^[А-яа-я]"' in 'order clause'
    3. The SQL being executed was: SELECT * FROM `user` WHERE `status`=10 ORDER BY `fio "REGEXP ^[А-яа-я]"` DESC, `city` DESC, `fio "REGEXP ^[A-za-z]"` DESC, `fio`
    4.  
    5. Error Info: Array
    6. (
    7.     [0] => 42S22
    8.     [1] => 1054
    9.     [2] => Unknown column 'fio "REGEXP ^[А-яа-я]"' in 'order clause'
    10. )
    11.  
    12. Caused by: PDOException
    13. SQLSTATE[42S22]: Column not found: 1054 Unknown column 'fio "REGEXP ^[А-яа-я]"' in 'order clause'
    [​IMG]

    Как правильно записать ORDER BY `fio` REGEXP '^[А-яа-я]' DESC, `city` DESC, `fio` REGEXP '^[A-za-z]' DESC, `fio` в yii2 ?
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
  3. DS32

    DS32 Новичок

    С нами с:
    13 окт 2020
    Сообщения:
    10
    Симпатии:
    0
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    А вы точно прочитали, что по ссылке написано?
    upload_2020-10-22_11-49-47.png
    И ошибку которая возникает, точно прочитали? Без этого класса Yii расценивает всю вашу регулярку, как колонку, и заключает в обратные апострофы.
     
  5. DS32

    DS32 Новичок

    С нами с:
    13 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    Т.е. получается нужно просто добавить строчку use yii\db\Expression; ?
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.598
    Симпатии:
    1.764
    оооохххх....
    Код (Text):
    1.  
    2. $query = User::find()
    3. ->where(['status' => User::STATUS_ACTIVE])
    4. ->orderBy(new yii\db\Expression('fio "REGEXP ^[А-яа-я]" DESC, city DESC, fio "REGEXP ^[A-za-z]" DESC, fio'))
    5. ->ALL();
    Что-то в этом роде. PHP нифига не знаете, как и английский, видимо...
     
    DS32 нравится это.
  7. DS32

    DS32 Новичок

    С нами с:
    13 окт 2020
    Сообщения:
    10
    Симпатии:
    0
    1000 раз Спасибо!)))) Не всегда могу понять, что хочет и в чем может быть проблема.