Поиск по связанной таблице

146
06 июля 2019, 14:40

yii2, есть модель поиска:

class ProductsBarcodesSearch extends ProductsBarcodes
{
    public function rules()
    {
        return [
            [['id'], 'integer'],
            [['barcode','product_id', 'code', 'name'], 'safe'],
        ];
    }
    public function scenarios()
    {
        // bypass scenarios() implementation in the parent class
        return Model::scenarios();
    }
    public function search($params)
    {
        $query = ProductsBarcodes::find()->joinWith('product');
        // add conditions that should always apply here
        $dataProvider = new ActiveDataProvider([
            'query' => $query,
        ]);
        $this->load($params);
        if (!$this->validate()) {
            // uncomment the following line if you do not want to return any records when validation fails
            // $query->where('0=1');
            return $dataProvider;
        }
        $query->andFilterWhere(['product_barcode.id' => $this->id]);
        // grid filtering conditions
        $query
            ->andFilterWhere(['like', 'product.name', $this->product_id])
            ->andFilterWhere(['like', 'product_barcode.barcode', $this->barcode]);
        return $dataProvider;
    }
}

так все работает (поиск по имени из связанной таблицы), но стоит сделать так:

    $query
        ->andFilterWhere(['like', 'product.name', $this->product_id])
        ->andFilterWhere(['like', 'product.code', $this->product_id]) //вот это добавил
        ->andFilterWhere(['like', 'product_barcode.barcode', $this->barcode]);

и все ломается, перестает искать как по имени, так и по полю code

как правильно тянуть эти данные из связанной таблицы, чтобы работал поиск?

Answer 1

нашел решение.

  1. нужно добавить новые свойства классу:

    class ProductsBarcodesSearch extends ProductsBarcodes
    {
        public $pname;
        public $pcode;
  2. задать значение, по которому будут искаться данные:

        ->andFilterWhere(['like', 'product.name', $this->pname])
        ->andFilterWhere(['like', 'product.code', $this->pcode])
  3. прописать во view в атрибутах эти свойства

        [
            'attribute' => 'pcode',
            'label' => 'Внутренний код',
            'value' => function($model){
                if ($model->product_id){
                    return $model->product->code;
                }
                return 'Нет кода';
            }
        ],
        [
            'attribute' => 'pname',
            'label' => 'Название продукта',
            'format' => 'html',
            'value' => function($model){
                if ($model->product_id){
                    return Html::a($model->product->name, \yii\helpers\Url::to(['/products/view?id=' . $model->product->id]));
                }
                return 'Нет имени';
            }
        ],

единственное что я пока не пока как сделать, это сортировка по этим полям. если знаете как реализовать, напишите.

READ ALSO
Какой лимит скорости записи в syslog

Какой лимит скорости записи в syslog

Собираюсь строить систему мониторинга ошибок на основе сислога => ELKПишу ошибки из PHP в сислог:

123
Долгий поиск match/against из php

Долгий поиск match/against из php

Проблема такая: один и тот же SQL запрос из PHP может идти например 45 секунд (логируется все точно - это только время запроса, а не загрузки всей...

145
Как с помощью регулярных выражений из строки получить цифры / №

Как с помощью регулярных выражений из строки получить цифры / №

Есть строка Приход № 5146 12/12/2018 Имя Перейти как получить = № 5146 12/12/2018 Имя

126
Подключение openssl в проект visual studio c++

Подключение openssl в проект visual studio c++

библиотека opensslНеобходимо использовать метод MD5

178