4

その場で仮想フィールドを作成したいと思います。

私の注文と注文の詳細は...

//Order Model
class Order extends AppModel {
    public $name = 'Order';
    public $actsAs = array('Containable');
    public $hasMany = array(
        'OrderDetail' => array(
            'className' => 'OrderDetail',
            'foreignKey' => 'order_id',
            'dependent' => true
        ),
    );
}

//OrderDetail Model
  class OrderDetail extends AppModel {
    public $name = 'OrderDetail';
    public $actsAs = array('Containable');
    public $belongsTo = array(
        'Order' => array(
            'className' => 'Order',
            'foreignKey' => 'order_id',
            'dependent' => true
        ),
    );
}

モデル関係はこんな感じ。注文のページネーションでアイテムの数とそのコストをカウントできるように、その場で仮想フィールドを作成しています。の奇妙な方法を知っていrequestActionます。私が自分の仕事を遂行できる他の方法はありますか。

私の試したコードは

        $this->Order->virtualFields['totalCost'] = 0;
        $this->Order->virtualFields['totalItem'] = 0;
        $fields = array('Order.id', 'Order.order_key', 'Order.delivery_date','COUNT(`OrderDetail`.`order_id`) AS `Order__totalItem`', 'SUM(`OrderDetail`.`cost`) AS `Order__totalCost`');         

        $this->paginate['Order'] = array("fields"=>$fields, 'conditions' => array("AND" => array($condition, "Order.status" => 3)), 'limit' => '50', 'order' => array('Order.id' => 'DESC'));

mysql not found 列で終わりますUnknown column 'OrderDetail.order_id' in 'field list'。私は、モデルを再帰的にしたり、バインドしたりして、何か他のものを見つけていません。なぜこのエラーが生成されるのですか? どうすれば目標を達成できますか。

4

2 に答える 2

14

その場で仮想フィールドを作成できます。構文は正しいですが、次の方法でも実行できます。

$this->Order->virtualFields['totalCost'] = 'SUM(`OrderDetail`.`cost`)';
$this->Order->virtualFields['totalItem'] = 'COUNT(`OrderDetail`.`order_id`)';

ここでの問題は、Order が OrderDetail と HasMany の関係にあることです。この場合、CakePHP はテーブルを結合せず、Orders 用と OrderDetail 用の 2 つのクエリを作成し、レコードセットをマージします。

あなたは何ができますか?

Order の代わりに OrderDetail をページ付けし、Order.id でグループ化できます。

$fields = array
(
    'Order.id', 
    'Order.order_key', 
    'Order.delivery_date', 
    'Order.totalItem', 
    'Order.totalCost'
);         

$this->paginate['OrderDetail'] = array
(
    "fields"=> $fields, 
    'conditions' => array("AND" => array($condition, "Order.status" => 3)), 
    'limit' => '50', 
    'order' => array('Order.id' => 'DESC'),
    'group' => array('Order.id')
);
于 2013-10-10T07:20:18.727 に答える
0

これを使用して、cakephp でオンザフライで仮想フィールドを作成できます。

class User extends AppModel {
    public $virtualFields = array(
            'full_name' => 'CONCAT(User.first_name, " ",User.last_name)'
        ); 
}

ここで full_name は、ファーストネームとラストネームを使用してユーザーのフルネームを作成するオンザフライの仮想フィールドです。

于 2015-07-14T06:27:41.680 に答える