使用cakephp 3.x计算包含的实体

时间:2016-02-02 22:51:02

标签: php cakephp-3.0

在尝试计算实体并在此之后对结果集进行排序时,我陷入困境。

我已将模型相互连接:

// 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包括所有用户。

我会很高兴任何提示。

1 个答案:

答案 0 :(得分:0)

您应该尝试Counter Cache

  

虽然可以为belongsToMany关联做这项工作。您需要在关联选项中配置的自定义通过表中启用CounterCache行为。了解如何使用“through”选项配置自定义联接表。

这消除了动态计算的需要,并为用户提供了一个字段。产品数量和产品数量用户表分别。