2010-12-29 13 views
0

ソース上のRubyで実装され、私は(コードではなく、SQLを使用して)CakePHPの中に仮想属性を達成するにはどうすればよい:http://asciicasts.com/episodes/16-virtual-attributesRailsの

私は以下のように同様の設定を達成するために好きですが、CakePHPの中に、どこで仮想たい属性はSQLではなくコードを使用して作成されます(http://book.cakephp.org/view/1070/Additional-Methods-and-Properties#Using-virtualFields-1590で文書化されています)。

class User < ActiveRecord::Base 
    # Getter 
    def full_name 
    [first_name, last_name].join(' ') 
    end 

    # Setter 
    def full_name=(name) 
    split = name.split(' ', 2) 
    self.first_name = split.first 
    self.last_name = split.last 
    end 
end 

答えて

2

あなたが正しく言及したように、virtualFieldは、SQLを使用するモデル用の追加の属性を作成するために使用されます。

function afterFind($results) { 
    foreach ($results as $key => $val) { 
     if (isset($val['User']['first_name']) && isset($val['User']['last_name'])) { 
      $results[$key]['User']['full_name'] = $this->formatName($val['User']['first_name'], $val['User']['last_name']); 
     } 
    } 
    return $results; 
} 

function formatName($firstName, $lastName) { 
    $firstName = trim($firstName); 
    $lastName = trim($lastName); 
    return $lastName . ', ' . $firstName; 
} 

あなたが本hereからこの上の詳細を読むことができます:コードを使用してフィールドを生成するために、あなたはafterFind方法を試してみてください。私はこれをもう少しテストしなければならないと思いますが、おそらくafterFindメソッドの2番目のパラメータ$primaryを含める必要があります。


EDIT:私はこれを行うための別の方法は、あなたのモデルに直接このような機能を含めることであろうことに気づい:

function getFullName($user = null) { 
    if ($user) { 
     $this->set($user); 
    } 
    return $this->data['User']['first_name'] . ' ' . $this->data['User']['last_name']; 
} 

そして、あなたのゲッターがあります!

1

beforeSaveコールバックとafterFindコールバックを使用できます。ここに私のコードです:

class User extends AppModel { 

    // Setter 
    function beforeSave() { 
     if(!empty($this->data['User']['full_name'])) { 
      list($this->data['User']['first_name'], $this->data['User']['last_name']) = explode(" ", $this->data['User']['full_name']); 
     } 

     return true 
    } 

    // Getter 
    function afterFind(array $results, bool $primary) { 
     foreach($results as $key => $result) { 
      $result['User']['full_name'] = $result['User']['first_name'] + " " + $result['User']['last_name']; 

      $results[$key] = $result; 
     } 

     return $results; 
    } 
} 

私はSQL concatはPHPの文字列の連結より高速だと思う。だから、私は(可能であれば)仮想フィールドを使う方が良いと思う。