我是一名新蛋糕烘焙师。我开发了一个汽车网站,其中每个汽车类别有很多汽车,而每辆车只属于一个汽车类别。在我的汽车模型中,我编写了以下代码:
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')));
}
在我的汽车 View 中,我编写了以下代码:
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
我无法弄清楚我的代码出了什么问题。请帮帮我
谢谢
最佳答案
首先,您没有遵守 CakePHP 命名约定。 (查看它们 here )这样做可以帮助您发现小错误,例如模型的类名是 Cars,而它应该是 Car。我还将您的表重命名为 car_categories
,因此将所有出现的 Carcategory
重命名为 CarCategory
。
models/car.php
class Car extends AppModel {
var $name = 'Car';
var $belongsTo = array('CarCategory', 'User');
}
models/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
)
);
}
controllers/cars_controller.php
function beforeFilter() {
$this->set('carCategories', $this->Car->CarCategory->find('list'));
}
注意:您不需要指定顺序,因为您已经在模型中将其作为默认顺序提及。另外,请注意 View 变量的命名约定。这将让我们执行一些 CakePHP 魔法,只需在 View 中输入以下内容即可:
查看
echo $form->input('car_category_id', array('class' => 'short'));
再次强调,不要迂腐,但标签应该是Car Category,而不是现在的Carcategories,因为一辆汽车只能属于一个类别根据您的数据模型。
如果您希望所有标签都使用“:”分隔符,则可以使用 CSS 添加它们。检查here了解如何。您还可以为表单输入指定 Between
选项。
表格
将表carcategories
重命名为car_categories
将 cars 表中的列 carcategory_id
重命名为 car_category_id
回到你的实际问题:
Undefined property: CarsController::$CarCategory
这意味着您无法从 CarsController
访问 CarCategory
模型。默认情况下,CarsController
将管理 Car
模型。为了管理 CarCategory 模型,您可以通过多种方式之一来完成:
- 使用关联:
$this->Car->CarCategory->find( ... )
- 在 Controller 中,按如下所示设置 $uses 变量:
var $uses = array('Car', 'Carcategory');
您也可以动态加载模型(如果您感兴趣,可以使用 loadModel
或 ClassRegistry::init
),但是由于您正在获取beforeFilter 中的汽车类别列表,您应该坚持使用上述方法之一(最好是关联)。
希望有帮助。请记住仔细查看所有模型、 Controller 、文件和表格的名称。
关于php - cakePHP 中的 hasMany 组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481206/