use*_*505 2 cakephp cakephp-3.0
这是所有选择后SQL的连接,
FROM users Users
LEFT JOIN userinfos Userinfos ON Userinfos.id = (Users.userinfo_id)
INNER JOIN offices Offices ON Offices.id = (Userinfos.office_id)
Run Code Online (Sandbox Code Playgroud)
好吧,我有一个使用CakePHP 3的数据库(MySQL)设置,用户表具有在另一个表中保存的扩展信息.
另一个表也扩展了办公室/地址信息但是默认设置为NULL,所以我想将它包含在'contains'调用中,但是当它为空时不会返回用户数据?
所以这就是我目前使用的,
$UsersTable->find('all')
->contain(['Userinfos','Userinfos.Offices'])
->toArray();
Run Code Online (Sandbox Code Playgroud)
但是,办公室(officeinid表中的office_id字段)并不总是设置,但我仍然希望它返回所有用户,即使他们没有办公室设置.
所以我试过了,
$UsersTable->find('all')
->contain([
'Userinfos',
'Userinfos.Offices'
])
->where(['Userinfos.office_id IS' => NULL])
->toArray();
Run Code Online (Sandbox Code Playgroud)
也,
$UsersTable->find('all')
->contain([
'Userinfos',
'Userinfos.Offices' =>
function($q) {
return $q->where(['Userinfos.office_id IS' => NULL]);
}
])
->toArray();
Run Code Online (Sandbox Code Playgroud)
该$UsersTable
变量被设置为
$UsersTable = TableRegistry::get('Users');
Run Code Online (Sandbox Code Playgroud)
如果我Userinfos.Offices
从包含条件中删除它,那么它将返回所有当前用户.但是,我如何调用这些额外的数据/信息,以便我可以访问Office信息,例如,如果设置了位置名称?
*我可能没有清楚地解释自己,如果有什么我可以更好地解释,请告诉我,谢谢.
在cakePhp3.x中默认烘焙模型时,连接表设置为INNER JOIN
.您需要修改模型关联.您需要将关联设置为LEFT JOIN
.
在你的情况下,如果你在src/model/UserinfosTable中查看'UserinfosTable',请确保你'左'加入'User'表或者你可以完全删除'joinType',因为在默认情况下cakephp设置Contain
为'LEFT JOIN'
class UserinfosTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Userinfos', [
'foreignKey' => 'office_id',
'joinType' => 'LEFT'
]);
}
}
Run Code Online (Sandbox Code Playgroud)