0

CakePHP は初めてですが、Rails を使用しています。私は CakePHP でこのようなことをしたいと思います:

class Manager < ActiveRecord::Base
    has_many :employees
end

次に、次のようにオブジェクトに尋ねます。

m = Manager.find(1)
# Sends SQL query SELECT COUNT * FROM EMPLOYEES WHERE MANAGER_ID = 1
count = m.employees.count

# Sends SQL query SELECT * FROM EMPLOYEES WHERE MANAGER_ID = 1
m.employees.each do |e|
    puts e.name
end

このコードはCakePHPにあります...

class Manager extends AppModel {
    public $hasMany = array(
        'Employee' => array(
            'className'  => 'Employee',
            'order'      => 'Employee.created DESC'
        )
    );
}

class Employee extends AppModel {
    public $belongsTo = 'Manager';
}

これらの (上記の) 機能 (ORM によって RoR で簡単に作成されます) を CakePHP で実装するにはどうすればよいですか?

手伝ってくれてありがとう...

神話ラッシュ

4

2 に答える 2

2

あなたの質問は、「id=1 のマネージャーを取得して、彼の従業員を見つけるにはどうすればよいですか。

CakePHP では、次の検索クエリを発行して、目的のマネージャー エントリを取得します。

$manager = $this->Manager->findById(1);
// or
$manager = $this->Manager->find('first', array(
    'conditions' => array(
        'Manager.id' => 1
    )
);

上記の検索呼び出しは、データベースから id=1 のマネージャーを取得します。また、リレーションシップ Manager hasMany Employee を設定したため、結果には、Employee.created DESC によって並べ替えられたマネージャーのすべての従業員も含まれます。

結果セットは次のようになります。

Array
(
    [Manager] => Array
        (
            [id] => 1
            [field1] => value1
        )

    [Employee] => Array
        (
            [0] => Array
                (
                    [id] => 2
                    [manager_id] => 1
                    [name] => Bar
                )

            [1] => Array
                (
                    [id] => 1
                    [manager_id] => 1
                    [name] => Foo
                )

        )

)

ご覧のとおり、CakePHP は返される結果に配列形式を使用し、Ruby on Rails のようなオブジェクトではありません。したがって、結果の配列内の関連データにアクセスする必要があります。

CakePHP と Ruby on Rails(RoR) のもう 1 つの重要な違いは、CakePHP ではデータベースへのクエリが呼び出された瞬間に実行されるのに対し、RoR では結果にアクセスしようとした瞬間に遅延実行されることです。

ここで従業員にアクセスするための RoR の例を補完するのは、CakePHP バージョンです。

$employee_count = count($manager['Employee']);

foreach ($manager['Employee'] as $e) {
    echo $e['name'];
}

これで混乱が解消されることを願っています。

于 2012-11-23T11:06:42.950 に答える