【问题标题】:CakePHP bindModel working, preset Model associations notCakePHP bindModel 工作,预设模型关联不
【发布时间】:2011-01-29 04:48:56
【问题描述】:

我正在开发一个个人项目。

我有两个模型“Show”和“Episode”。我有一个控制器“Ops”。

显示模型:

class Show extends AppModel
{
 var $name = 'Show';

 var $hasMany = array(
  'Episode' => array(
   'className' => 'Episode',
   'foreignKey' => 'show_id'
  )
 );
}

剧集模型:

class Episode extends AppModel
{
 var $name = 'Episode';

 var $belongsTo = array(
  'Show' => array(
   'className' => 'Show',
   'foreignKey' => 'show_id'
  )
 ); 
}

运维控制器:

class OpsController extends AppController
{
 var $name = 'Ops';
 var $uses = array('Show','Episode');

 function index()
 {
  $episodes = $this->Episode->find('all',array(
   'limit' => 10,
   'order' => array('Episode.first_aired' => 'DESC'),
   )
  );
  debug($this->Episode);
  debug($episodes);

 }
}

运行 Ops 控制器时,我得到了我想要的“Episode”记录,但没有获得基于“belongsTo”配置中的“show_id”的关联“Show”记录。看来它根本没有引用模型,因为我可以故意破坏模型类而请求仍在继续。

经过大量检查、研究和测试后,我能够通过在 find() 请求之前将以下内容添加到 Ops 控制器中来使其工作:

$this->Episode = ClassRegistry::init('Episode');
$this->Episode->bindModel(
 array('belongsTo' => array(
   'Show' => array(
    'className' => 'Show'
   )
  )
 )
);

虽然这可行,但我仍然想知道为什么我的模型没有被正确调用。非常感激任何的帮助。谢谢!

【问题讨论】:

    标签: cakephp model associations belongs-to


    【解决方案1】:

    如果你以同样的方式查询Show会发生什么?

    您确定id 字段的定义正确吗?

    在两个表上都应该有id(INTsize),在episodes上也应该有show_id(INTsize)。

    如果它是根据 Cake 约定设置的,您应该可以删除 'foreignKey' => 'show_id' 行,Cake 会自行整理。`

    【讨论】:

    • 是的,我已经仔细检查了字段类型并且设置正确。我也尝试过使用和不使用具有相同结果的“foreignKey”设置。我正在处理的主要问题是使用 $uses 变量时未包含模型类。我故意在我的模型中添加错误,而“使用”它们的控制器不会出错。
    【解决方案2】:

    听起来 Cake 没有使用您的模型文件,而是根据表格自动生成一些模型文件。 这听起来很愚蠢,但请检查文件夹和文件名是否有拼写错误以及它们是否为小写。

    【讨论】:

      【解决方案3】:

      在您的 Show 模型中,您将 Episode 外键设置为 show_id,它应该是 episode_id。但是,我不认为这是导致问题的原因。

      据我所知,您没有更改任何 CakePHP 命名约定,因此只需删除定义关联的数组并保留为字符串,例如

      class Show extends AppModel
      {
       var $name = 'Show';
      
       var $hasMany = array(
        'Episode'
       );
      }
      
      class Episode extends AppModel
      {
       var $name = 'Episode';
      
       var $belongsTo = array(
        'Show'
       ); 
      }
      

      这可能不起作用,但我之前遇到过类似的问题,这解决了它。祝你好运。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多