Cgridview : Display Sum Of Data From A Linked Table

Hi everyone,

I curently have a problem with the CGridview widget.

Here is a simplified diagram of my data

In summary, I can create transactions "Transaction" that contain one or several items (eg, "Food", "Rental", etc.) that each have a cost.

Each transaction are created by one person "User".

Finaly, a transaction is assigned "Assignment" to one or several users. The assignment defines who paid the how much percentage of the transaction.

On one of the pages of my application based on the model "Assignment", I want to display the following information:

  • Assignment->id

  • Assignment->Transaction->date

  • Assignment->User->pseudo

  • Assignment->percent

  • Assignment->Transaction->description

  • array_sum(Assignment->Transaction->Item->debit)

I can display everything except the last one ( array_sum(Assignment->Transaction->Item->debit) ). The goal is to display on each line the total cost of the transaction.

How can I do?

Here are the tests I’ve done without success:

Controller:




<?php


class NameController extends GxController {




	// ...

        

    public function actionCGridview() {

		$model = new Assignment('search');

		$model->unsetAttributes();


		if (isset($_GET['Assignment']))

			$model->setAttributes($_GET['Assignment']);


		$this->render('test', array(

			'model' => $model,

		));

	}


}



View :




<?php


// ...


$this->widget('zii.widgets.grid.CGridView', array(

	'id' => 'transaction-grid',

	'dataProvider' => $model->search(),

	'filter' => $model,

	'columns' => array(

		'id',

		array(

				'name'=>'transaction_id',

				'value'=>'GxHtml::valueEx($data->Transaction)',

				'filter'=>GxHtml::listDataEx(Transaction::model()->findAllAttributes(null, true)),

				),

		array(

				'name'=>'user_id',

				'value'=>'GxHtml::valueEx($data->User)',

				'filter'=>GxHtml::listDataEx(User::model()->findAllAttributes(null, true)),

				),

		'percent',

		array(

            'name' => 'Transaction',

            'header'=>'Description',

            'value' => '(($data->Transaction)?$data->Transaction->description:"")',

        ),

		array(

            'name' => 'Transaction.Item.debit',

            'header'=>'Sum',

            'value' => '(($data->Transaction->Item)?array_sum($data->Transaction->Item->debit):0)',

        ),

		

		array(

			'class' => 'CButtonColumn',

		),

	),

));


?>



Assignment model :




<?php


class Assignment extends GxActiveRecord {


	// ...


	public function relations() {

		return array(

				'User' => array(self::BELONGS_TO, 'User', 'user_id'),

				'Transaction' => array(self::BELONGS_TO, 'Transaction', 'transaction_id'),

		);

	}


	public function search() {

		$criteria = new CDbCriteria;


		$criteria->compare('id', $this->id);

		$criteria->compare('transaction_id', $this->transaction_id);

		$criteria->compare('user_id', $this->user_id);

		$criteria->compare('percent', $this->percent);

		$criteria->compare('transacted', $this->transacted);

		

		$criteria->compare('Transaction.description', $this->transaction_id);

		$criteria->compare('Transaction.Item.debit', $this->Transaction->Item->debit);


		return new CActiveDataProvider($this, array(

			'criteria' => $criteria,

		));

	}

}



Transaction model :




<?php


class Transaction extends GxActiveRecord {


	// ...


	public static function representingColumn() {

		return 'date';

	}

	

	public function relations() {

		return array(

			'Assignment' => array(self::HAS_MANY, 'Assignment', 'transaction_id'),

			'Item' => array(self::HAS_MANY, 'Item', 'transaction_id'),

			'user' => array(self::BELONGS_TO, 'User', 'user_id'),

		);

	}

	

	// ...


}



A big thank you in advance for your help.