CakePHP 2.0 添加相关数据失败,缺少数据库表

Posted

技术标签:

【中文标题】CakePHP 2.0 添加相关数据失败,缺少数据库表【英文标题】:CakePHP 2.0 Adding Related Data fails with missing database table 【发布时间】:2012-02-16 17:35:56 【问题描述】:

我正在尝试同时将数据保存到两个模型(一个模型和相关的 hasMany),并且在我的应用程序的许多地方都取得了一些成功,但是这种方法似乎不适用于表/模型带有下划线的名称,即

//View Code
echo $this->Form->create('Product');
  echo $this->Form->input('name',array('between' => '<br />'));
  echo $this->Form->input('Component.0.text',array('between' => '<br />'));
echo $this->Form->end(__('Submit'));

//Controller Code
if ($this->Product->saveAssociated($this->request->data)) 
    $this->Session->setFlash(__('The product has been saved'));
    $this->redirect(array('action' => 'index'));
 else 
    $this->Session->setFlash(__('The product could not be saved. Please, try again.'));

以上工作正常,但是我有一个模型 ProductComponent (db table product_components)

//View Code
echo $this->Form->create('Product');
  echo $this->Form->input('name',array('between' => '<br />'));
  echo $this->Form->input('ProductComponent.0.text',array('between' => '<br />'));
echo $this->Form->end(__('Submit'));

//Controller Code
if ($this->Product->saveAssociated($this->request->data)) 
    $this->Session->setFlash(__('The product has been saved'));
    $this->redirect(array('action' => 'index'));
 else 
    $this->Session->setFlash(__('The product could not be saved. Please, try again.'));

表单显示的是 Textarea 而不是标准输入,因此可以正确选择它,但是当运行 saveAssociated 时,我得到了响应:

找不到模型 ProductComponent 的数据库表 product__components。

为什么 cake 会寻找带有双下划线名称的表?

有什么想法吗?

Issem Danny 更新:

public $hasMany = array(
    'ProductComponent' => array(
        'className' => 'Product_Component',
        'foreignKey' => 'product_id',
        'dependent' => false,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'exclusive' => '',
        'finderQuery' => '',
        'counterQuery' => ''
    )
          );

【问题讨论】:

您可以发布您的模型以便我们查看您的关系设置吗?我的猜测是那里出了点问题。您是否在 ProductComponent 模型中设置了 $useTable 属性? 我认为你是对的,我刚刚发现我在产品的 hasMany 定义中输入了错误的类名,这可以解释为什么它在单独使用时会起作用。如果您发布了正确的答案,我会感谢您。 【参考方案1】:

一些事情:

如果您有这三个模型:Product、Component、ProductComponent,在我看来,您正在尝试设置 hasAndBelongsToMany 关系。 Check out the cakephp docs.

使用组件作为模型名称或在模型名称中似乎让我感到困惑..

如果您有一个表 product_components 的模型:您的模型应命名为“ProductComponent”,不带下划线(cake 会自动添加该下划线)。如果您不遵循 cake 的约定,您可以声明“useTable”属性。您的模型应如下所示:

代码:

// model

class ProductComponent extends AppModel 
    public $name = "ProductComponent";

    // Only needed when not following cake's conventions
    public $useTable = "product_components"; 

    // rest of model code  ...


// And the hasmany relation

public $hasMany = array(
    'ProductComponent' => array(
        'className' => 'ProductComponent',
        'foreignKey' => 'product_id'
     )
);

希望有帮助,祝你好运。

【讨论】:

非常感谢 Danny... 第一个示例中的组件只是保存从另一个控制器复制代码的示例,因此不需要 HABTM。不过,请注意 hasMany 的问题,谢谢【参考方案2】:

你试过用吗

$this->Product->saveAll($this->data))

试试这个链接SaveAll

【讨论】:

嗨,Alex,是的,我同时使用了 saveAll 和 saveAssociated,问题似乎出在关系上,因为直接访问 ProductComponent 就可以了

以上是关于CakePHP 2.0 添加相关数据失败,缺少数据库表的主要内容,如果未能解决你的问题,请参考以下文章

尝试使用 cakephp 2.0 保存表单数组数据

cakephp 在不使用视图的情况下保存 HABTM 关系的数据

CakePHP 3.0 连接数据库失败

CakePHP:用户数据 saveAll 静默失败?

CAKEPHP 3 和 Dompdf - 缺少 Cpdf.php 类

Cakephp 3.x试图查看上传的图像导致缺少控制器错误