我是一个新的蛋糕面包师。我开发了一个汽车网站,每个汽车都有很多汽车,每辆汽车只属于一个汽车类别。在我的Cars模型中,我编写了以下代码:
class Cars extends AppModel
{
var $name = 'Cars';
var $belongsTo = array('Carcategory','User');
}
在我的Carcategory模型中,我编写了以下代码:
class Carcategory extends AppModel {
var $name = 'Carcategory';
var $hasMany = array(
'Car' => array(
'className' => 'Car',
'foreignKey' => 'carcategory_id',
'order' => 'carcategory.name ASC',
'dependent'=> true
)
);
}
在我的car_controller中,我编写了以下代码:
function beforeFilter(){
$this->set('car_categories',$this->Carcategory->find('list', array('order' => 'name')));
}
在我的汽车视图中,我写了以下代码:
echo $form->input('carcategory_id', array('options' => $car_categories, 'label' => 'Cars Categories : ', 'class' => 'short'));
我的数据库表格如下:
CREATE TABLE `carcategories` (
`id` int(11) NOT NULL auto_increment,
`name` varchar(50) NOT NULL,
`image` varchar(50) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
CREATE TABLE `cars` (
`id` int(11) NOT NULL auto_increment,
`title` varchar(255) character set utf8 collate utf8_bin NOT NULL,
`name` varchar(255) character set utf8 collate utf8_unicode_ci NOT NULL,
`model` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
`motorcc` varchar(100) character set utf8 collate utf8_unicode_ci NOT NULL,
`details` text character set utf8 collate utf8_unicode_ci NOT NULL,
`carcategory_id` int(11) NOT NULL,
`userid` int(11) NOT NULL,
`hits` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
我已经命名了第一个表carcategory,因为我可能会在我的网站上添加其他服务,而这些服务可能还有其他类别 我的代码生成以下错误
Notice (8): Undefined property: CarsController::$Carcategory [APP\controllers\cars_controller.php, line 14]
Fatal error: Call to a member function find() on a non-object in c:\wamp\www\work\cake\app\controllers\cars_controller.php on line 14
我无法弄清楚我的代码中有什么问题。请帮我一把 感谢
答案 0 :(得分:1)
首先,你并没有坚持CakePHP命名惯例。 (查看它们here)这样做可以帮助你发现一些小错误,例如你的模型的类名是 Cars ,当它应该是 Car 。我还会将您的表格重命名为car_categories
,因此所有Carcategory
都会重命名为CarCategory
。
<强>模型/ car.php 强>
class Car extends AppModel {
var $name = 'Car';
var $belongsTo = array('CarCategory', 'User');
}
<强>模型/ car_category.php 强>
class CarCategory extends AppModel {
var $name = 'CarCategory';
var $hasMany = array(
'Car' => array(
'className' => 'Car',
'foreignKey' => 'car_category_id',
'order' => 'CarCategory.name ASC',
'dependent' => true
)
);
}
<强>控制器/ cars_controller.php 强>
function beforeFilter() {
$this->set('carCategories', $this->Car->CarCategory->find('list'));
}
注意:您无需指定订单,因为您已在模型中将其作为默认订单提及。另请注意视图变量的命名约定。这将让我们做一些CakePHP魔术,只需在视图中输入:
查看强>
echo $form->input('car_category_id', array('class' => 'short'));
同样,不要迂腐,但标签应该是 Car Category 而不是 Car Categories ,因为你现在拥有它,因为Car只能属于一个类别根据您的数据模型。
如果您想要所有标签的“:”分隔符,可以使用CSS添加它们。检查here以了解具体方法。您还可以为表单输入指定between
选项。
<强>表格强>
将表格carcategories
重命名为car_categories
将cars表中的列carcategory_id
重命名为car_category_id
回到你的实际问题:
Undefined property: CarsController::$CarCategory
这意味着您无法从CarCategory
访问CarsController
模型。默认情况下,CarsController
会管理Car
模型。为了管理CarCategory模型,您可以通过多种方式之一来实现:
$this->Car->CarCategory->find( ... )
var $uses = array('Car', 'Carcategory');
您也可以即时加载模型(如果您感兴趣,可以使用loadModel
或ClassRegistry::init
),但由于您在beforeFilter中获取了汽车类别列表,应坚持上述方法之一(最好是协会)。
希望有所帮助。请记住以所有模型,控制器,文件和表格的名称仔细查看 。
答案 1 :(得分:0)
在您的汽车控制器中,查找应为
$this->set('car_categories',$this->Car->Carcategory->find('list', array('order' => 'name')));