Intereting Posts

Структура Yii: использование данных из соответствующих моделей Active Record для поиска

Yii 1.1 разработка приложений Поваренная книга объясняет метод использования данных из соответствующих моделей Active Record для поиска соответствующих моделей. Этот метод объясняется на страницах 193 и 194. Я попытался интегрировать этот метод в мое приложение, но он не работает. может ли кто-нибудь объяснить мне, доступна ли эта функция в версии Yii версии 1.1.8

В этом месте также я мог найти комментарии для поиска активной формы записей, связанных с форматом данных. Но это также не работает. http://www.yiiframework.com/doc/api/1.1/CDbCriteria

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

Таблица заказов и Таблица пользователей имеют отношение «Один к многим».

У пользователя много заказов, и заказ имеет ровно один пользователь.

Итак, я редактирую следующий CDbCriterial, чтобы включить имя и таблицу имен пользователей в поле «Записи таблиц заказов».

Таблица заказов имеет следующие соотношения

public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( 'comments' => array(self::HAS_MANY, 'Comment', 'order_id'), 'user' => array(self::BELONGS_TO, 'User', 'user_id'), 'orderstatus' => array(self::BELONGS_TO, 'Orderstatus', 'orderstatus_id'), 'commentCount' => array(self::STAT, 'Comment' , 'order_id') ); } 

Это условия поиска / фильтра с включенным именем таблицы пользователя

 public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->compare('id',$this->id); $criteria->compare('order_create_date',$this->order_create_date,true); $criteria->compare('price',$this->price,true); $criteria->compare('bank_account_number',$this->bank_account_number,true); $criteria->compare('hardwaredetail_Id',$this->hardwaredetail_Id); $criteria->compare('user_id',$this->user_id); $criteria->compare('order_update_date',$this->order_update_date,true); $criteria->compare('is_received',$this->is_received); $criteria->compare('order_received_date',$this->order_received_date,true); $criteria->compare('is_notify_by_email',$this->is_notify_by_email); $criteria->compare('warehouse_offered_price',$this->warehouse_offered_price,true); $criteria->compare('warehouse_offered_price_date',$this->warehouse_offered_price_date,true); $criteria->compare('orderstatus_id',$this->orderstatus_id); $criteria->together = true; $criteria->with = array('user'); $criteria->compare('user.name',$this->user,true); //$criteria->compare('user.name',$this->user->name); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } 

и страница администрирования заказа отредактированы, чтобы отобразить имя, зарегистрированное следующим образом

 <?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'order-grid', 'dataProvider'=>$model->search(), //'filter'=>$model, 'columns'=>array( 'id', 'order_create_date', 'price', 'bank_account_number', array( 'name'=>'user', 'value'=>'$data->user->name' ), ), )); 

Сообщение об ошибке возвращено

введите описание изображения здесь

После решения проблемы неоднозначности столбца id, применяя решение, которое thaddeusmt дал, я столкнулся со следующим сообщением об ошибке.

введите описание изображения здесь

Заранее благодарю за любую помощь

Related of "Структура Yii: использование данных из соответствующих моделей Active Record для поиска"

Я мог найти ответ. Это все, что я сделал.

Ниже приведены две таблицы, которые у меня есть. Заказ и пользователь

введите описание изображения здесь

У меня есть страница Order / Admin, код, созданный по умолчанию, предоставляет только данные таблицы заказов. Я хочу связать поле имен пользовательских таблиц в критериях поиска.

Это начальный вид страницы поиска.

введите описание изображения здесь

Я хочу интегрировать имя пользователя, поданное из другой таблицы в этот поиск. то окончательный вид будет следующим.

введите описание изображения здесь

так что это шаги, которые я сделал.

сначала в модели порядка i имеют следующие соотношения

  public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( 'user' => array(self::BELONGS_TO, 'User', 'user_id'), ); } This is generated by Yii framework , i did nothing :) Then , i changed the search method as follows public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->compare('t.order_create_date',$this->order_create_date,true); $criteria->compare('t.price',$this->price,true); $criteria->compare('t.bank_account_number',$this->bank_account_number,true); $criteria->compare('t.hardwaredetail_Id',$this->hardwaredetail_Id); //$criteria->compare('user_id',$this->user_id); $criteria->compare('t.order_update_date',$this->order_update_date,true); $criteria->compare('t.is_received',$this->is_received); $criteria->compare('t.order_received_date',$this->order_received_date,true); $criteria->compare('t.is_notify_by_email',$this->is_notify_by_email); $criteria->compare('t.warehouse_offered_price',$this->warehouse_offered_price,true); $criteria->compare('t.warehouse_offered_price_date',$this->warehouse_offered_price_date,true); $criteria->compare('t.orderstatus_id',$this->orderstatus_id); $criteria->together = true; $criteria->compare('t.id',$this->id,true); $criteria->with = array('user'); $criteria->compare('name',$this->user,true,"OR"); return new CActiveDataProvider($this, array( 'criteria'=>$criteria, )); } 

важно поместить t в начало t если поле первичного ключа таблицы заказа, если оба имеют имя сохранения. в моем случае это id и id, поэтому мне пришлось положить t.

Другое дело – порядок элементов

$ criterial-> concer = true; должны поступать перед реляционными элементами.

затем u обновлен до правила в таблице Order. я добавил, что пользователь подал заявку и присвоил имя безопасным атрибутам.

 public function rules() { // NOTE: you should only define rules for those attributes that // will receive user inputs. return array( //array(' orderstatus_id', 'required'), array('hardwaredetail_Id, user_id, is_received, is_notify_by_email, orderstatus_id', 'numerical', 'integerOnly'=>true), array('price, warehouse_offered_price', 'length', 'max'=>10), array('bank_account_number', 'length', 'max'=>100), array('order_create_date, order_update_date, order_received_date, warehouse_offered_price_date, user,name', 'safe'), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, order_create_date, price, bank_account_number, hardwaredetail_Id, user_id, order_update_date, is_received, order_received_date, is_notify_by_email, warehouse_offered_price, warehouse_offered_price_date, orderstatus_id', 'safe', 'on'=>'search'), ); } 

Наконец, обновите свой код пользовательского интерфейса.

 <?php $this->widget('zii.widgets.grid.CGridView', array( 'id'=>'order-grid', 'dataProvider'=>$model->search(), 'filter'=>$model, 'columns'=>array( 'id', 'order_create_date', 'price', 'bank_account_number', array( 'name'=>'user', 'value'=>'$data->user->name' ) )); ?> 

я обновил администратор заказа с помощью

 array( 'name'=>'user', 'value'=>'$data->user->name' ) 

Это то, что я сделал, и это сработало для меня. спросите меня, нужна ли вам помощь. Спасибо всем, кто относится к этой проблеме.

Похоже, что и user и order имеют столбцы с именем id . И ваши критерии используют их как в предложении WHERE, что дает сообщение об ошибке «неоднозначное» mySql.

При использовании with критериями (которые делают SQL JOIN для таблиц), если две из ваших таблиц имеют столбцы с одинаковым именем, вам нужно использовать префикс mySql «dot» при условиях, например:

 $criteria->compare('t.id',$this->id); // the default table prefix in Yii is "t" 

Когда я присоединяюсь к таблице, используя $criteria->with I, префикс всех имен столбцов (в моих критериях compare и condition и т. Д.), Например:

 $criteria->compare('t.id',$this->id); // t $criteria->compare('t.order_create_date',$this->order_create_date,true); // t $criteria->with = array('user'); $criteria->compare('user.name',$this->user_id,true); // user (the filter will set user_id) 

Ваш gridview должен выглядеть следующим образом:

 array( 'name'=>'user_id', 'header'=>'User', 'sortable'=>false, 'value'=>'$data->user->name' ), 

Кроме того, я думаю, что есть большая проблема, поскольку вы указываете на свое редактирование:

Ваша функция поиска настроена следующим образом: user.name',$this->user -, но $this->user будет возвращать текущий пользовательский объект через отношение, а не критерии поиска. Фильтр столбцов задает свойство user_id.

EDIT : Нет, вы можете $this->user качестве имени столбца, пока вы установите его как safe атрибут.

О том, как я это оборачиваюсь, более подробно показано здесь:

Искать в столбце модели BELONGS_TO с CGridView, Yii

Сортировка с этим не будет работать – просто фильтрация.

Вот хороший пост на форуме Yii, который также может дать вам дополнительные подсказки:

http://www.yiiframework.com/forum/index.php?/topic/9083-search-filter-of-a-relations-field-through-cgridview/

К сожалению, сортировка и фильтрация CGridViews на отношениях – это не функциональность по умолчанию. Вы можете легко отображать соответствующую информацию с именем столбца, таким как user.name , но оно не будет сортировать или фильтровать. Удачи!