如何在相关表格中使用实体名称而不是ID

时间:2019-01-10 12:42:46

标签: cakephp-3.0

我正在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']);
}

我希望在程序表的relatedUsers中获取用户的电子邮件,但实际输出为:

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

真的需要帮助

谢谢。

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分:0)

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

您可以将查询更改为:

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

现在执行查询并仅返回第一项。

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