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 дал, я столкнулся со следующим сообщением об ошибке.
Заранее благодарю за любую помощь
Я мог найти ответ. Это все, что я сделал.
Ниже приведены две таблицы, которые у меня есть. Заказ и пользователь
У меня есть страница 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, который также может дать вам дополнительные подсказки:
К сожалению, сортировка и фильтрация CGridViews на отношениях – это не функциональность по умолчанию. Вы можете легко отображать соответствующую информацию с именем столбца, таким как user.name
, но оно не будет сортировать или фильтровать. Удачи!