如何在CakePHP 3.0中进行预先加载?

时间:2015-07-31 18:45:50

标签: php cakephp cakephp-3.0

我使用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查询 我误解了应该如何运作的方式吗?或者在我的代码中犯了错误?

0 个答案:

没有答案