【问题标题】:How can I have the name of my entity instead of the id in the related tables如何在相关表中使用我的实体名称而不是 id
【发布时间】:2019-01-10 12:42:46
【问题描述】:

我正在CakePHP 3.x 上创建一个项目,我是新手。我在使用 hasMany 相关表来获取我的实体名称而不是它们的 ID 时遇到问题。

我来自 CakePHP 2.x,在那里我使用了 App::import('controller', array('Users'),但在视图中检索所有要显示的数据而不是 id,据说这是一种不好的做法。而且我不希望在我的新代码中有任何代码违规。有谁能够帮我?这是代码:

public function view($id = null)
{     
     $this->loadModel('Users');
     $relatedUser = $this->Users->find()
         ->select(['Users.id', 'Users.email'])
         ->where(['Users.id'=>$id]);
     $program = $this->Programs->get($id, [
         'contain' => ['Users', 'ProgramSteps', 'Workshops']
     ]);

     $this->set(compact('program', 'users'));
     $this->set('_serialize', ['ast', 'relatedUser']);
}

我希望在program表的relatedUsers中得到用户的email,但实际输出是:

Notice (8): Trying to get property 'user_email' of non-object [APP/Template\Asts\view.ctp, line 601].

真的需要帮助

提前谢谢你。

【问题讨论】:

  • 你能把debug($relatedUser)的结果放在控制器动作的最后吗?我怀疑查询对象根本没有执行。
  • 这是我在运行 debug($relatedUser) 警告 (512) 时得到的结果:无法发出标头。在文件中发送的标头=C:\xampp\htdocs\Apps\apc-crud\vendor\cakephp\cakephp\src\Error\Debugger.php line=952 [CORE\src\Http\ResponseEmitter.php, line 48] 代码上下文Cake\Http\ResponseEmitter::emit() - CORE\src\Http\ResponseEmitter.php,第 48 行 Cake\Http\Server::emit() - CORE\src\Http\Server.php,第 141 行 [main] - ROOT\webroot\index.php,第 40 行
  • 不,这不是调试结果。您引用了从页面产生的警告。请给出调试结果。
  • object(Cake\ORM\Query) { '(help)' => '这是一个 Query 对象,用于获取结果执行或迭代。', 'sql' => 'SELECT Users .id AS Users__id, Users.email AS Users__email FROM users Users WHERE Users.id = :c0', 'params' => [ ':c0' => [ 'value' => '1', 'type ' => 'integer', 'placeholder' => 'c0' ] ], 'defaultTypes' => [ 'Users__id' => 'integer', 'Users.id' => 'integer', 'id' => ' integer', 'Users__slug' => 'string', 'Users__email' => 'string', 'Users.email' => 'string', 'email' => 'string', 'Users__password' => 'string' ] ,

标签: cakephp-3.0


【解决方案1】:

您已要求它序列化 relatedUser 变量,但这是针对 JSON 和 XML 视图的。您实际上还没有 set 视图的 relatedUser 变量:

$this->set(compact('program', 'users', 'relatedUser'));

另外,您在此处设置了 $users 变量,但它从未被初始化。

【讨论】:

  • 好的,对不起,我出去有一段时间了;我能理解,我会检查更改。谢谢
【解决方案2】:

除了@Greg 的答案,变量$relateduser 仍然是一个查询对象,这意味着尝试访问email 属性将失败。仍然需要先执行查询。

您可以将查询更改为:

 $relatedUser = $this->Users->find()
     ->select(['Users.id', 'Users.email'])
     ->where(['Users.id' => $id])
     ->first();

现在执行查询并返回唯一的第一个条目。

有很多方法可以让查询执行,其中很多都是隐式使用的。见:

【讨论】:

  • 我得到一个语法错误,意外的 '->' (T_OBJECT_OPERATOR) 与 ->first();
  • 这很奇怪。很确定我帖子中的语法是正确的。也许再检查一遍,看看我附加的链接。
  • 有用的链接,谢谢罗伯托,它解决了我的问题。现在我正在使用 loadModel 但在一个单元格中,这似乎是一个更好的方法。
  • 酷。是的,单元格提供了一种存储通用逻辑的绝佳方式。您能选择一个最佳答案,还是自己总结一个答案?
  • 对不起,我是这个网站的新用户,所以我可能还需要一些帮助
猜你喜欢
  • 2011-03-06
  • 1970-01-01
  • 2021-04-17
  • 2010-10-17
  • 1970-01-01
  • 2011-09-04
  • 2016-01-06
  • 2016-07-12
  • 1970-01-01
相关资源
最近更新 更多