2012-04-18 8 views
0

私は、モデル内でvirtualFieldを使用して別のモデルフィールドをエイリアスしようとしている既存のCakeプロジェクトを初めて使いました。コンテキストにおいて:他のモデルフィールドのエイリアスとしての仮想フィールド - SQL:Unknown Column Error

class Product extends AppModel { 

    var $name = 'Product'; 
    var $hasOne = array('ProductPrice'); 

    var $virtualFields = array(
     'price' => 'ProductPrice.current_price' 
    ); 

    // Typical fields in the database for Product. id, name, etc. 
} 

class ProductPrice extends AppModel { 
    var $name = 'ProductPrice'; 
    var $belongsTo = array('Product'); 

    // Fields are product_id, current_price 
} 

ProductPriceモデルは、製品の現在の価格の検索を可能にするCURRENT_PRICEカラムを異なる価格ティアを含むデータベースのビューのためのものです。

$this->Product->find('all' ....); 

私は価格フィールドの取得に問題はありません。私は問題はSQLがによって生成されたということであることを知っている
SQL Error: 1054: Unknown column 'ProductPrice.current_price' in 'field list' [CORE/cake/libs/model/datasources /dbo_source.php、ライン681]

を:製品への問合せが

$this->Inventory->find('all'); 

のようなものを介して間接的に行われている場合、問題は我々が得るですInventoryクエリはProductPriceビューに参加しようとしません。私は、これが "hasOne" ProductPriceを知っているので、これがProductモデルを介して自動的に起こると仮定しました。

Inventoryモデルの「再帰的」を2,1などに設定しようとしましたが、成功しませんでした。

私には何が欠けていますか?

答えて

3

TLDR:あなたはVirtualFieldに異なるモデルからのフィールドを使用することはできません


その他のオプション:

あなたのようなクエリをやっている場合:

$this->Inventory->find('all'); 

をあなたはあなたが必要なデータを取得している作るためにCakePHPのContainable behaviorのようなものを使用することができます:

//controller code 
$inv = $this->Inventory->getInventory(); 

//model code 
class Inventory extends AppModel { 

    public $actsAs = array('Containable'); 

    public function getInventory() { 
     return $this->find('all', array(
      'contain' => array(
       'Product' => array(
        'ProductPrice' 
       ) 
      ) 
     )); 
    } 
} 

コンテナの使用

[0] => Array 
    (
     [Inventory] => Array 
      (
       [id] => 12345 
      ) 
     [Product] => Array 
      (
       [0] => Array 
        (
         [id] => 54321 
         [title] => product A 
        ) 
       [ProductPrice] => Array 
       (
        [id] => 6789 
        [current_price] => 24.99 
       ) 
      ) 
//... 

あなたがそのようなデータを取得すると、製品の現在の価格にアクセスするために簡単なはず:ル上記のコード例のように形式のデータにこのような何かを返す必要があります。

コントローラーで行うこともできますが、「Fat Model、Skinny Controller」のマントラ内にとどまるようにクエリをモデルに保存することをお勧めします。あなたが本当にあなたのコントローラでそれを維持したい場合は、あなただけでこれを行うことができます。

$inv = $this->find('all', array(
    'contain' => array(
     'Product' => array(
      'ProductPrice' 
     ) 
    ) 
); 

(BUTを - あなたはまだ()最初のコード例あたりのモデル$ actsAs収容可能ということを指定する必要が

+0

いただきありがとうございます。情報私がチャンスを得るとき、私はこれを実装し、フィードバックを試みます。 –

関連する問題