我似乎无法弄清楚可包含的行为是如何工作的,或者如何从相关模型中检索(和基于)数据。
我需要在cakephp find('all')函数中放入以下MySQL查询,我知道我可以使用sql语法的查询构建器,但我想使用find函数并想弄清楚它是如何工作的。
SELECT events.id, events.name FROM events, user_roles
WHERE user_roles.event_id = events.id
AND user_roles.user_id = 1
这个想法很简单,在user_roles中存储了user_id,role_id和event_id。现在我想检索某个用户的所有事件(此处为user_id = 1)。我尝试了以下几种变体:
$data = $this->Event->find('all',array(
'contain' => array(
'UserRole' => array(
'fields' => array('id'),
'conditions' => array(
'UserRole.user_id' => $this->Auth->user('id')
)
)
)
));
但这会让所有事件都回归。我想要的是一个数组(或具有相同关联数据的任何其他结果):
array(
[0] => array(
[Event] => array(
'id' => 1,
'name' => 'Event Name'
),
[UserRole] => array(
'role_id' => 2,
'event_id'=> 1
)
[1] => array(
.... etc ...
)
定义了以下模型和关联
class Event extends AppModel {
public $hasMany = array(
'UserRole' => array(
'className' => 'UserRole',
'foreignKey' => 'event_id',
'dependent' => false,
)
)
)
class UserRole extends AppModel {
public $belongsTo = array(
'Event' => array(
'className' => 'Event',
'foreignKey' => 'event_id'
),
)
)
那它是如何运作的;)。
修改
我忘了提到我已经在AppModel.php中设置了:
public $recursive = -1;
答案 0 :(得分:0)
Containable查找原始查询的关联记录。您所做的是find('all')
模型上的Event
完全没有条件,因此将返回所有事件。
然后,Containable将检索给定UserRole
的所有user_id
条记录,并且还会Event
event_id
相关联
如果您只想检索给定用户的事件,可以采用以下两种方式之一
通过Event-> UserRole关联和链式模型:
$data = $this->Event->UserRole->find('first', array(
'conditions' => array('UserRole.user_id' => $this->Auth->user('id'),
'contain' => array('Event')
));
$events = $data['Event'];
或
通过当前代码,然后使用Hash::extract
方法获取匹配的事件。 (Hash
是CakePHP核心类)
$events = Hash::extract('/UserRole[user_id='.$this->Auth->user('id').']/..', $data);