CakePHP 3:添加额外的字段以从模板访问

时间:2018-07-20 11:27:50

标签: cakephp cakephp-3.x

我正在使用CakePHP 3.6

我有两个模型UsersWalletTransactions

WalletTransactionsUsersuser_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; ?>

现在,我想在模板的用户列表中显示priceWalletTransactions的总和。

为此,我编写了一个函数来获取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 ?>

它什么也不打印。

如何显示模板中其他模型的值?

1 个答案:

答案 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'));
}

另请参见