检索hasOne关系中的belongsTo关系数据(深层关联)

时间:2014-04-23 20:02:24

标签: cakephp cakephp-2.0 cakephp-2.3 model-associations

我正在使用Teaser模型构建此CakePHP应用程序,每个Teaser都有一个Location。 每个Location都属于CountryState

Teaser(和视图)的索引端,我想显示与此Country.abbr相关联的State.title的{​​{1}}和Location

协会

预告

Teaser

位置

public $hasOne = array('Location');

国家

public $belongsTo = array('Teaser','Country','State');

国家

public $hasMany = array('Location');

我尝试了什么

默认

如果我执行以下操作

public $hasMany = array('Location');

在我的$teasers = $this->Teaser->find('all'); 中,它将无法获取正确的国家/地区和州。我已经看到它正常工作,我通过Teaser模型在我的视图中获取国家/地区标题没有问题,如下所示:

TeasersController

所以首先这个工作,在处理了一些其他的东西之后,我注意到它停止了工作(不确定是否其他东西影响了这个,但我没有触及模型。作为一个优秀的程序员,我开始在这里寻找。

可包含的行为

我已经读过关于可包含行为的惊人内容,所以我查看了如何使用它并想出了以下内容。

$teaser['Location']['Country']['title'];
$teaser['Location']['State']['title'];

这不起作用,它会出现以下错误: $this->Teaser->Behaviors->attach('Containable'); $teasers = $this->Teaser->find('all', array( 'contain' => array( 'Location' => array( 'Country', 'State' ), 'User', ), )); $this->set('teasers', $teasers);

递归参数

我已经尝试将递归设置为2(或者与可包含行为相关联的-1),因为它之前是其他人的解决方案,但我已经看到了关于如何更好地坚持可包含行为的评论。

实际问题

那么,有没有人知道我在这里做错了什么?语法是错误的还是我将这些关联混淆了?

相关问题

此外,我在主要部分遗漏了相关问题,但是Model "Location" is not associated with model "Country"Country之间的关联是一个明智的想法吗?我们这会让事情变得更复杂吗?

1 个答案:

答案 0 :(得分:0)

我不会动态添加可包含的行为,而是将以下属性添加到AppModel中,因为使用containsable应该是默认状态,而不是异常。

public $actsAs = array('Containable'); 
public $recursive = -1;

如果您还没有意识到,人们说使用可包含而不是递归的原因是递归将始终获得所有内容,即使您不需要它。因此递归易于使用,但它会鼓励不良习惯。

至于你的查询,我没有看到任何因为不正确而跳出来的东西。我会尝试,仅作为测试,做

  $this->Teaser->recursive = 2;
  $teasers = $this->Teaser->find('all');

然后看看它带来了什么。如果它不包含您的关联数据,您将知道关联本身存在问题。如果它确实获得了相关数据,那么它就是查询的内容。

至于你的相关问题,更多的是设计问题,不一定有正确的答案。