我对模型关联有疑问。请考虑以下应用程序:每个月向用户询问一个新问题。这些能够提出这个问题的提示,其他用户有能力对此提示做出反应。我的模型设置是这样的:
Users hasMany Tips, Reactions
Tips belongsTo User
Tips hasMany Reactions
Reactions belongsTo User, Tip
现在我想从所有用户那里获得有关该问题的所有提示。我在提示表上做了一个简单的查找,它返回了与用户和反应相关的所有提示。然而,反应并不包含用户,这显然非常重要。
Cake会自动将我的查找全部转换为两个查询:一个在加入用户的tips-table上,另一个在react表上,但是在users-table上没有连接,这就是我需要的。
所以我的问题是:为什么用户表没有加入反应,我该如何解决?
代码:
用户模型:
public $hasMany = array('Tip', 'Reaction');
提示模型:
public $hasMany = array('Reaction' => array(
'foreignKey' => 'tip_id'
));
public $hasOne = array('User' => array(
'fields' => array(
'User.id, User.first_name, User.last_name'
),
'foreignKey' => 'id'
));
反应模型:
public $belongsTo = array('Tip', 'ReactionUser' => array(
'className' => 'User',
'foreignKey' => 'id'
));
控制器:
$tips = $this->Tip->find('all');
输出:
array(
(int) 0 => array(
'Tip' => array(
'id' => '1',
'user_id' => '1',
'question_id' => '1',
'tip' => 'Testing da new datavbase',
'votes' => '0',
'approved' => '1',
'pic' => '',
'created' => '2012-05-18 09:22:56'
),
'User' => array(
'id' => '1',
'first_name' => 'Bart',
'last_name' => 'De Bock'
),
'Reaction' => array(
(int) 0 => array(
'id' => '1',
'tip_id' => '1',
'user_id' => '1',
'reaction' => 'lorem ipsum',
'votes' => '0',
'approved' => '1',
'pic' => '',
'created' => '0000-00-00 00:00:00'
)
)
),
(int) 1 => array(
'Tip' => array(
'id' => '2',
'user_id' => '2',
'question_id' => '1',
'tip' => 'Test',
'votes' => '0',
'approved' => '1',
'pic' => '',
'created' => '2012-05-18 10:22:51'
),
'User' => array(
'id' => '2',
'first_name' => 'Deborah',
'last_name' => 'Rochtus'
),
'Reaction' => array(
(int) 0 => array(
'id' => '2',
'tip_id' => '2',
'user_id' => '3',
'reaction' => 'Say whaat?',
'votes' => '2',
'approved' => '1',
'pic' => '',
'created' => '2012-05-18 10:33:32'
),
(int) 1 => array(
'id' => '3',
'tip_id' => '2',
'user_id' => '4',
'reaction' => 'Hmmm..',
'votes' => '0',
'approved' => '1',
'pic' => '',
'created' => '2012-05-18 10:33:44'
)
)
)
)
如您所见,这些反应不包含相关用户......
感谢您的帮助!
答案 0 :(得分:0)
使用包含:
在AppModel中:
public $uses = array('Containable');
将您的查找电话更改为:
$this->Tip->find('all', array('contain' => array('User', 'Reaction' => array('User'))));
答案 1 :(得分:0)
请试试这个
$tips = $this->Tip->find('all'
array(
'recursive'=>'2'
)
);
递归值可能需要1,2,3,4等。