这是所有选择后SQL的连接,
FROM users Users
LEFT JOIN userinfos Userinfos ON Userinfos.id = (Users.userinfo_id)
INNER JOIN offices Offices ON Offices.id = (Userinfos.office_id)
好吧,我有一个使用CakePHP 3的数据库(MySQL)设置,用户表具有在另一个表中保存的扩展信息。
此另一个表也扩展了办公室/地址信息,但默认设置为NULL,因此我想将其包含在'包含'当空的时候调用但不会返回用户数据?
所以这就是我目前使用的,
$UsersTable->find('all')
->contain(['Userinfos','Userinfos.Offices'])
->toArray();
但是,办公室(officeinid表中的office_id字段)并不总是设置,但是我仍然希望它返回所有用户,即使他们没有办公室设置。
所以我试过了,
$UsersTable->find('all')
->contain([
'Userinfos',
'Userinfos.Offices'
])
->where(['Userinfos.office_id IS' => NULL])
->toArray();
另外,
$UsersTable->find('all')
->contain([
'Userinfos',
'Userinfos.Offices' =>
function($q) {
return $q->where(['Userinfos.office_id IS' => NULL]);
}
])
->toArray();
$UsersTable
var设置为
$UsersTable = TableRegistry::get('Users');
如果我从包含条件中删除Userinfos.Offices
,那么它将返回我当前的所有用户。但是,如何调用这些额外的数据/信息,以便我可以访问Office信息,例如位置名称,如果已设置?
*我可能没有清楚地解释自己,如果有什么我可以更好地解释,请告诉我。谢谢。
答案 0 :(得分:6)
In cakePhp3.x in default when you bake a Model the join table is set to INNER JOIN
. You would need to modify the model associations. You need to set the association to LEFT JOIN
.
In your case if you look at 'UserinfosTable' in src/model/UserinfosTable make sure you are 'LEFT JOIN' ing the 'User' table or you can completely remove the 'joinType' because in default cakephp sets the Contain
to 'LEFT JOIN'
class UserinfosTable extends Table
{
public function initialize(array $config)
{
$this->belongsTo('Userinfos', [
'foreignKey' => 'office_id',
'joinType' => 'LEFT'
]);
}
}
答案 1 :(得分:2)
尝试将IS NULL
子句添加为值而不是键/值对:
例如:
$UsersTable->find('all')->where(['Userinfos.office_id IS NULL'])
答案 2 :(得分:1)
这是执行NOT NULL的正确方法(null只是isNull(
->where(function ($exp, $q) {
return $exp->isNotNull('office_id');
});