php - cakePHP 中的 hasMany 组合框

标签 php mysql cakephp

我是一名新蛋糕烘焙师。我开发了一个汽车网站,其中每个汽车类别有很多汽车,而每辆车只属于一个汽车类别。在我的汽车模型中,我编写了以下代码:

    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');

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

希望有帮助。请记住仔细查看所有模型、 Controller 、文件和表格的名称。

关于php - cakePHP 中的 hasMany 组合框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481206/

相关文章:

cakephp - 如何在 CakePHP 3 中使用 beforeSave? $event、$entity 和 $options 必须始终填写?

PHP REGEX - 在换行符处按 preg_split 排列的文本

php - 数据库抽象层——那是什么?

php - 使用模数排序

java - 如何使用 MariaDB Connector/J 与 MySQL 建立 SSL 连接?

python - 如何在 Beautifulsoup 中分解 HTML 元素以将它们插入到 MySQL 数据库表中?

database - Cakephp 表单错过通信

validation - CakePHP:为什么没有显示验证错误?

PHP preg_match 占位符 [@varname]

php - 计算两个日期的剩余时间百分比