我正在使用Teaser
模型构建此CakePHP应用程序,每个Teaser
都有一个Location
。
每个Location
都属于Country
和State
。
在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
之间的关联是一个明智的想法吗?我们这会让事情变得更复杂吗?
答案 0 :(得分:0)
我不会动态添加可包含的行为,而是将以下属性添加到AppModel中,因为使用containsable应该是默认状态,而不是异常。
public $actsAs = array('Containable');
public $recursive = -1;
如果您还没有意识到,人们说使用可包含而不是递归的原因是递归将始终获得所有内容,即使您不需要它。因此递归易于使用,但它会鼓励不良习惯。
至于你的查询,我没有看到任何因为不正确而跳出来的东西。我会尝试,仅作为测试,做
$this->Teaser->recursive = 2;
$teasers = $this->Teaser->find('all');
然后看看它带来了什么。如果它不包含您的关联数据,您将知道关联本身存在问题。如果它确实获得了相关数据,那么它就是查询的内容。
至于你的相关问题,更多的是设计问题,不一定有正确的答案。