我使用CakePHP 3.0.10并且我对加载的热切关联感到困惑 文档说(http://book.cakephp.org/3.0/en/orm/entities.html#lazy-loading-associations):
Eager加载使用连接(如果可能)在尽可能少的查询中从数据库中获取数据。当需要单独的查询时,就像HasMany关联一样,会发出一个查询来获取当前对象集的所有关联数据。
和(http://book.cakephp.org/3.0/en/orm/retrieving-data-and-resultsets.html#eager-loading-associations):
通过预先加载生成的查询可以更好地利用联接,从而可以进行更高效的查询。在CakePHP中,您可以使用'contains'方法
定义预先加载的关联
示例:
$query = $articles->find('all');
$query->contain(['Authors', 'Comments']);
据我了解,此代码应创建一个带有两个“join”语句的SQL查询 在我的项目中,我有两个关联的表,但即使我使用'contains'方法,它也会创建两个SQL查询。 更具体一点:
class UsersTable extends Table
{
public function initialize(array $config)
{
$this->table('users');
$this->displayField('id');
$this->primaryKey('id');
$this->addBehavior('Timestamp');
$this->hasMany('Friends', [
'foreignKey' => 'user_id'
]);
}
}
class FriendsTable extends BaseTable
{
public function initialize(array $config)
{
$this->table('friends');
$this->displayField('id');
$this->primaryKey('id');
$this->belongsTo('Users', [
'foreignKey' => 'user_id',
'joinType' => 'INNER'
]);
}
}
数据库中的'friends'表有一个约束:
“users_friends_fk1”FOREIGN KEY(user_id)REFERENCES users(id)MATCH FULL ON UPDATE CASCADE ON DELETE CASCADE
在我的控制器中:
TableRegistry::get('Users')->find()->contain('Friends')->toArray();
执行此语句后我在queries.log中看到的内容:
2015-07-31 18:27:28调试:SELECT Users.id AS“Users__id”,Users.username AS“Users__username”,Users.password AS“Users__password”FROM users Users
2015-07-31 18:27:28调试:SELECT Friends.id AS“Friends__id”,Friends.user_id AS“Friends__user_id”,Friends.friend_id AS“Friends__friend_id”FROM friends朋友WHERE Friends.user_id in(1, 6,4,2,3,5,7,8)
我用一个连接激活了一个SQL查询 我误解了应该如何运作的方式吗?或者在我的代码中犯了错误?