使用cakePHP 3.0创建WebApp。
我有一个用户模型和表,它拥有并属于许多用户。
所以我根据蛋糕惯例设置表格:
CREATE TABLE IF NOT EXISTS `users`
(
user_id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
);
和JOIN表:
CREATE TABLE IF NOT EXISTS `users_users`
(
supervisor_id int,
employee_id int,
FOREIGN KEY (supervisor_id) REFERENCES users(user_id),
FOREIGN KEY (employee_id) REFERENCES users(user_id)
);
在我的UserTable.php中,我创建了这些关联:
$this->table('users');
$this->primaryKey('user_id');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
$this->belongsToMany('Supervisors', [
'className' => 'Users',
'targetForeignKey' => 'supervisor_id'
]);
$this->belongsToMany('Employees', [
'className' => 'Users',
'targetForeignKey' => 'employee_id'
]);
现在,在一个新的模型方法中,我希望得到一名员工的主管:
public function getSupervisorEmail($user_id) {
$supervisors = $this->Employees->Supervisors->find()->select(['user_id']);
debug($supervisors);
return $supervisors;
}
我将示例数据放在我的users_users表中,但我不知道如何访问这些条目。上面函数中的查询没有做我期望它做的事情。它只是从我的用户表中返回一条记录,而没有加入users_users表我不明白,因为我根据cakePHP 3的命名约定设置了所有...
如何访问我的联接表并获取相关记录? EG通过user_id 1获取与用户关联的主管。我尝试了不同的查询但没有使用我的联接表。
感谢您的回答!
答案 0 :(得分:2)
在HABTM的through选项中指定连接表对象(在3.0中,它已重命名为belongsToMany / BTM)assoc。否则,它将根据表名反射并构造一个Table对象实例。我总是创建连接表对象,所以现在就把它烘烤。
http://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations
到允许您提供要在连接表上使用的Table实例的名称,或者提供实例本身。这样可以自定义连接表键,并允许您自定义数据透视表的行为。
您不是在查询其他关联。在查询中包含()您的连接表模型。
http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#eager-loading-associations
默认情况下,使用find()时,CakePHP不会加载任何关联数据。您需要“包含”或急切加载要在结果中加载的每个关联。
$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);
答案 1 :(得分:1)
问题是我的概念错了。调试查询时的SQL语句不会显示cakePHP内部发生的每个SQL内容,因此您不会看到自动连接。
但现在我发现它完美地通过回应像cakePHP书http://book.cakephp.org/3.0/en/orm/associations.html#belongstomany-associations
中的testdata感谢@burzum试图帮助我提供的链接总是有用的。
答案 2 :(得分:0)
$users = $this->Users->find('all', [
'order' => [],
'conditions' => ['Users.id' => 1],
'contain' => ['Supervisors','Employees']
]
);
使用此