Tags

, , ,

Secara gampangnya, view adalah query yang disimpan di database. Querynya bisa berupa query dari beberapa tabel atau yang mengandung fungsi agregat. Nantinya view ini akan dapat kita akses seolah-olah sebagai sebuah tabel sungguhan. Termasuk juga membuat ActiveRecord dari view tersebut.

Di sini kita tidak sedang membuat view di database. Tetapi kita akan membuat emulasinya di Yii sebagai ActiveRecord. Nantinya AR tersebut dapat kita relasikan dengan AR sungguhan. Berikut adalah kelas dasarnya.

Setelah itu kita buat modelnya

<?php

namespace app\models;

use app\classes\QueryRecord;

/**
 * Description of InvoicePaid
 *
 * @author Misbahul D Munir <misbahuldmunir@gmail.com>
 * @since 1.0
 */
class InvoicePaid extends QueryRecord
{

    public function attributes()
    {
        return[
            'invoice_id', 'total'
        ];
    }

    public static function query()
    {
        return PaymentDtl::find()
                ->select(['invoice_id', 'total' => 'sum([[value]])'])
                ->groupBy(['invoice_id']);
    }
}

Kemudian kita bisa relasikan dengan AR kita

<?php

namespace app\models;

use Yii;

/**
 * This is the model class for table "{{%invoice}}".
 *
 * @property Vendor $vendor
 * @property Branch $branch
 * @property InvoiceDtl[] $items
 * @property PaymentDtl[] $paymentDtls
 * @property InvoicePaid $paid
 */
class Invoice extends \yii\db\ActiveRecord
{
    ...

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getPaid()
    {
        return $this->hasOne(InvoicePaid::className(), ['invoice_id' => 'id']);
    }
}

foreach(Invoice::find()->with('paid')->all() as $model){
    echo $model->paid->total;
}

Invoice::find()
    ->alias('i')
    ->joinWith('paid p')
    ->where('[[p.total]] < [[i.value]]')
    ->all(); // tampilkan semua invoice yang belum lunas
Advertisements