私のデータベースには、製造元とプラスチックの 2 つのテーブルがあります。
CREATE TABLE `manufacturer` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=30 DEFAULT CHARSET=utf8
CREATE TABLE `plastic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(64) NOT NULL DEFAULT '',
`manufacturer_id` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`,`manufacturer_id`),
KEY `manufacturer_id` (`manufacturer_id`),
CONSTRAINT `plastic_ibfk_1` FOREIGN KEY (`manufacturer_id`) REFERENCES `manufacturer` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=68 DEFAULT CHARSET=utf8
ご覧のとおり、プラスチックには、Yii がメーカーとの BELOGS_TO 関係と呼ぶものがあります。つまり、1 つのメーカーがいくつかの異なるプラスチックを製造することができます。
デフォルトのプラスチック管理ページからメーカー名で検索できるようにしようとしていますが、検索フィールドがメーカーの列に表示されません。私はこのガイドに従いましたが、ほとんどそこにいると思いますが、1つの小さな詳細にこだわっています.
上記のリンクにあるように、私のプラモデルのクラスでは、次のものがあります。
class Plastic extends CActiveRecord
{
public $manufacturer_search; //<-- added per the above link
public function rules()
{
return array(
array('manufacturer.name', 'length', 'max'=>64),
array('name', 'length', 'max'=>64),
array('name, manufacturer.name, manufacturer_search', 'safe', 'on'=>'search'),
);
}
public function relations()
{
return array(
'manufacturer' => array(self::BELONGS_TO, 'Manufacturer', 'manufacturer_id'),
);
}
public function search()
{
$criteria=new CDbCriteria;
$criteria->with=array('manufacturer');
$criteria->compare('name',$this->name,true);
$criteria->compare('manufacturer.name',$this->manufacturer_search, true);
return new CActiveDataProvider($this, array(
'criteria'=>$criteria,
));
}
}
管理ページは、CGridView ウィジェットを使用してすべてを表示します (これがデフォルトで、'columns' 属性以外は何も変更していません)。
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'plastic-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'name',
'manufacturer.name',
array(
'class'=>'CButtonColumn',
),
),
)); ?>
腹立たしいことは、検索が実際に機能することです。高度な検索をクリックして、製造元フィールドに何かを入力すると、機能します。しかし、私の人生では、検索ボックスをグリッド ビューに表示することはできません。
ここにいくつかのスクリーンショットがあります: ウィジェットに manufacturer_id を渡したときの管理ページのスクリーンショット、上記のコードのように manufacturer.name を渡したときのスクリーンショット、manufacturer_search を渡したときのスクリーンショット (とにかく動作するとは思っていませんでした) 、最後に高度な検索が適切に機能しているスクリーンショットです。
何か案は?ありがとう。