我已将模型相互连接:
// ProductsTable
$this->belongsToMany('Users', [
'through' => 'ProductsUsers',
'join_table' => 'products_users'
]
);
// UsersTable
$this->hasMany('Products', [
'through' => 'ProductsUsers',
]
);
// ProductsUsersTable
$this->belongsTo('Users');
$this->belongsTo('Products');
通过此查询,我获得包括用户的产品:
$products = $this->Products->find()
->contain([
'Users',
'ProductCategories'
]);
看起来像是:
Products
-> Product 1
-> User1, User2, User 3
-> Product 2
-> User1, User 3
现在我想对结果进行排序。但我的尝试失败了。
我试过了:
$products = $this->Products->find()
->contain([
'Users',
'ProductCategories'
])
->select([
'users_count' => $this->Products->find()->func()->count('Users')
])->order(['users_count' => 'asc'])
->select($this->Products);
但没有成功。 $ Products-> users_count包括所有用户。
我会很高兴任何提示。
答案 0 :(得分:0)
您应该尝试Counter Cache:
虽然可以为belongsToMany关联做这项工作。您需要在关联选项中配置的自定义通过表中启用CounterCache行为。了解如何使用“through”选项配置自定义联接表。
这消除了动态计算的需要,并为用户提供了一个字段。产品数量和产品数量用户表分别。