CakePHPの:モデルに関連するデータフィールドを含む仮想フィールド

StackOverflow https://stackoverflow.com/questions/3831872

  •  26-09-2019
  •  | 
  •  

質問

私は住所・モデルをに属しますモデルの従業員を持っています。私は従業員モデルからデータをフェッチすると、関連するアドレスレコードがあまりにもフェッチを取得します。また、アドレス・モデルはvirtualFieldのFULL_NAMEを持っています。このようなこのルックスます:

Array 
(
[0] => Array
       (
        [Employee] => Array
            (
                [id] => 1
                [address_id] => 33
                [username] => ...
                ...
            )

        [Address] => Array
            (
                [id] => 33
                [firstname] => Blah
                [full_name] => Blah Blubb
                ...
            )

    )

[1] => Array  (
        [Employee] => Array   (
                [id] => 2
                ...

私は、あまりにもデータ配列の従業員の一部にこのvirtualFieldが含まれているしたいような。

Array (
[0] => Array (
        [Employee] => Array
            (
                [id] => 1
                [full_name] => Blah Blubb
                ...
            )

TISがちょうど

を追加することによって解決することはできません
$virtualFields = array(
    'full_name' => 'CONCAT_WS(" ", Address.firstname, Address.surname)',
);

従業員モデルに、クックブックに述べて 提案された解決策があります(「あなたがそれらにアクセスする必要がある場合、実行時に別のモデルからvirtualFieldsをコピー」)が、私はこのソリューションを理解していません。どこでこれを置かなければならないのですか?コントローラには?検索機能のモデルでは?

ヘルプしていただきありがとうございます。

役に立ちましたか?

解決 2

私はafterFindモデルのコールバック関数の中で、今、手でこれをやってます:

array_walk($results,function(&$a){
        if(isset($a['Address']['full_name'])) {
            $a['Employee']['full_name'] = $a['Address']['full_name'];
            unset($a['Address']);
        }
    });

それは素敵ではないが、それが動作することがございます。

他のヒント

ます。http://ブック。 cakephp.org/view/1608/Virtual-fields#Virtual-fields-and-model-aliases-1632する

   1.3でvirtualFieldsの実装にはいくつかの制限があります。   まず、あなたがのために関連付けられているモデルでvirtualFieldsを使用することはできません   条件、順序、またはフィールドアレイ。そうすることで、一般的になります   フィールドとしてSQLエラーがORMで置き換えられません。これは   それは、関連する深さを推定することは困難ですので、   モデルが発見される可能性があります。

あなたのモデルに以下を追加します:

public function __construct($id=false,$table=null,$ds=null){
    parent::__construct($id,$table,$ds);
    $this->virtualFields = array(
        'full_name'=>"CONCAT(`Address.firstname`,' ',`Address.surname`)"
    );
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top