【问题标题】:adding hasMany association causes find() to not work well添加 hasMany 关联会导致 find() 无法正常工作
【发布时间】:2009-12-29 05:42:37
【问题描述】:

好吧,我有点迷路了……

我对 PHP 很陌生,我正在尝试将 CakePHP 用于我的网站。
我的数据库由两个表组成:

  • 具有 user_id、名称列的用户
  • 带有 copy_id、copy_name、user_id(作为用户的外键)列的副本。

我有匹配的 CakePHP 元素:

  • 用户和副本作为模型
  • UserController 作为控制器
  • 我不使用视图,因为我只是从控制器发送 json。

我在用户模型和复制模型之间添加了 hasMany 关系,见下文。

var $hasMany = array(
    'Copy' => array(
        'className' => 'Friendship',
        'foreignKey' => 'user_id'
    )
); 

在没有关联的情况下,用户表上的每个 find() 查询都可以正常工作,但是在将 hasMany 添加到模型后,用户上的相同 find() 查询停止工作(print_r 不显示任何内容),并且每个 find () 查询我在 Copy 模型上应用

$copy = $this->User->Copy->find('all', array(
    'condition' => array('Copy.user_id' => '2')
));

忽略条件部分,只返回整个数据库。

如何调试代码执行?当我添加 debug($var) 时,什么也没有发生。

【问题讨论】:

    标签: php cakephp associations


    【解决方案1】:

    我不是专家,但您可以从以下提示开始:

    1. 尝试按照 CakePHP 数据库命名 conventions。您不必这样做,但是让自动魔术发生要容易得多...将表中的主键更改为“id”,例如users.user_is --> users.id,copys.copy_id -->copies.id。
    2. 定义一个视图,只是为了调试。使用 $this->set('users', $users); 将模型中的任何信息传递给查看,并将其显示在 <pre></pre> 块中
    3. 如果这是您第一次尝试 php 和/或 CakePHP,请确保您至少完成了博客教程
    4. 让 CakePHP 为用户和副本生成(烘焙)一组工作模型/视图/控制器并检查生成的代码
    5. 有很好的关于 find 的文档:the multifunctional workhorseof all model data-retrieval functions

    【讨论】:

      【解决方案2】:

      我认为主要问题是这样的:

      'condition' => array('Copy.user_id' => '2')
      

      应该是“条件”。

      此外,请遵守命名约定。谢天谢地,Cake 可以让您覆盖几乎所有假定的名称,但默认情况下只做他们期望的事情会更容易。

      • 主键应全部命名为id
      • 控制器应该是复数形式:UsersController

      【讨论】:

      • 是的,这就是发帖者的find 查询失败的原因。可能排除了其余的讨论......
      【解决方案3】:

      首先,尽量遵循 CakePHP 约定。

      var $hasMany = array(
          'Copy' => array(
              'className' => 'Friendship',
              'foreignKey' => 'user_id'
          )
      );
      

      您的关联名称是“复制”,这是一个不同的表和模型,然后在您的类名上,您有“友谊”。

      为什么不

      var $hasMany = array(
           'Copy' => array('className'=>'Copy')
      );
      

      var $hasMany = array(
           'Friendship' => array('className'=>'Friendship') 
      );
      

      var $hasMany = array(
          'Copy' => array('className'=>'Copy'),
          'Friendship' => array('className'=>'Friendship')
      );
      

      另外,检查拼写错误,例如 conditions 而不是 condition

      【讨论】:

        【解决方案4】:

        您的表名也可能是问题所在。我有一张名为“Class”的桌子,它很适合蛋糕。我把它改成了 Myclass 之类的东西,它起作用了。 Class 是保留字,Copy 也可能是保留字。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-01-15
          • 1970-01-01
          • 2020-11-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多