cakePHP中有hasMany组合框

时间:2010-12-19 01:45:03

标签: php mysql cakephp

我是一个新的蛋糕面包师。我开发了一个汽车网站,每个汽车都有很多汽车,每辆汽车只属于一个汽车类别。在我的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

我无法弄清楚我的代码中有什么问题。请帮我一把 感谢

2 个答案:

答案 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( ... )
  • 在您的控制器中,按以下方式设置$ uses变量:var $uses = array('Car', 'Carcategory');

您也可以即时加载模型(如果您感兴趣,可以使用loadModelClassRegistry::init),但由于您在beforeFilter中获取了汽车类别列表,应坚持上述方法之一(最好是协会)。

希望有所帮助。请记住以所有模型,控制器,文件和表格的名称仔细查看

答案 1 :(得分:0)

在您的汽车控制器中,查找应为

$this->set('car_categories',$this->Car->Carcategory->find('list', array('order' => 'name')));