我正在使用CakePHP 3.6
我有两个模型Users
和WalletTransactions
。
WalletTransactions
与Users
与user_id
关联,并且具有列price
。
我正在使用以下代码显示用户列表
UsersController.php
public function index()
{
$users = $this->Users->find();
$this->set(compact('users'));
}
users / index.ctp
<?php foreach($users as $user): ?>
<?= $user->name ?>
<?php endforeach; ?>
现在,我想在模板的用户列表中显示price
中WalletTransactions
的总和。
为此,我编写了一个函数来获取price
中的WalletTransactionsTable.php
public function walletBalance($user_id)
{
$total_balance = 0;
$walletTransactions = $this->find()
->where([
'user_id' => $user_id
]);
foreach ($walletTransactions as $transaction) {
$total_balance += $transaction->price;
}
return $total_balance;
}
并在User.php
实体类中设置属性函数
protected function _balance()
{
$user_id = $this->_properties['id'];
$WalletTransactions = TableRegistry::get('WalletTransactions');
$transaction = $WalletTransactions->walletBalance($user_id);
return $transaction;
}
使用时,在users
循环中的模板中
<?= $user->balance ?>
它什么也不打印。
如何显示模板中其他模型的值?
答案 0 :(得分:1)
访问者必须以_get
(即_getBalance
)开头。但是,理想情况下,实体应该是愚蠢的数据容器,使它们发出查询不是最好的主意,更不用说每次访问属性时发出查询的效率都较低。
我建议使用例如自定义查找器。同样,也无需检索所有事务并在PHP级别上进行计算,而可以在SQL级别上轻松完成:
// UsersTable
public function findWithWalletBalance(\Cake\ORM\Query $query, array $options)
{
return $query
->leftJoinWith($this->WalletTransactions->getName())
->select([
'balance' => $query->func()->sum($this->WalletTransactions->aliasField('price'))
])
->group(array_map([$this, 'aliasField'], (array)$this->getPrimaryKey()))
->enableAutoFields(true);
}
// UsersController
public function index()
{
$users = $this->Users->find('withWalletBalance');
$this->set(compact('users'));
}
另请参见