it-swarm.dev

カスタムSQLステートメントを含むJForm

データベースにレコードを挿入し、JTableから派生した独自のコントローラー、モデル、ビュー、およびテーブルに依存するJFormがあります。

ただし、データベーステーブルには、請求書番号を表す1つの特別なフィールドが含まれています。これは、新しいレコードごとにインクリメントし、年末にリセットする必要があるため、その値はフォームで取得できませんが、単に計算する必要がありますレコードを保存する前。クエリ自体は少し複雑ですが、アイデアを与えるために、次のように非常に簡略化できます。

INSERT INTO `table` (`number`, `year`, `data`)
VALUES (
    (SELECT MAX(`number`) + 1 FROM `table` WHERE `year` = YEAR(CURDATE())),
    YEAR(CURDATE()),
    'some data...'
)

ここで質問、JTable :: store()はJDatabaseDriver :: insertObject()を使用してデータを保存するため、JTableにカスタムSQLステートメントの実行を要求できないため、これを達成するための最良の方法は何ですか?

5
Demis Palma ツ

table class;のstore()メソッドをオーバーライドできます。そのようなもの:

public function store($updateNulls = true) { // or false but you can't nullify a value if needed
    $db = JFactory::getDbo();
    $query = $db->getQuery(true);
    $query->select('MAX(`number`) + 1');
    $query->from('`#__table`');
    $query->where('`year` = YEAR(CURDATE())');
    $db->setQuery($query);
    $db->execute();
    $number = $db->loadResult();

    $date = JFactory::getDate();
    $year = $date->format('Y');

    $this->number = $number;
    $this->year = $year; // or get it by another db query but not recommended
    $this->data = 'some data...';

    return parent::store($updateNulls);
}
2
Farahmand

checkメソッドをテーブルクラスに追加できます。これは、デフォルトではbindの後、ただしstoreの前に実行されます。これは、レコードが有効であることを確認し、特定の行要件を処理する優れた方法です。

public function check() {
    // Only set the number if this is a new record (id = 0)
    if (property_exists($this, 'number') && $this->id == 0) {
         $db = JFactory::getDbo();
         $query = $db->getQuery(true);
         $query->select('MAX(`number`) + 1');
         $query->from('`#__table`');
         $query->where('`year` = YEAR(CURDATE())');
         $db->setQuery($query);
         $this->number = $db->loadResult();
    }

    return parent::check();
}
1
David Fritsch