0

別のフィールド名をリンクとして使用して、2 番目のレベルから値を取得できません。

アシテンシア モデル:

var $belongsTo = array('Employee');

ホラリオモデル:

var $belongsTo = array('Employee');

従業員モデル:

        var $hasMany = array(
            'Horario' => array(
                'foreignKey' => 'employee_id',
                'dependent' => true
            ),
            'Asistencia' => array(
                'foreignKey' => 'employee_id',
                'dependent' => true
            )
        );

サンプル レコードでこれらの値を使用して説明します。

Asistencia: employee_id = 3701
Employee  : id          = 3701

Asistencia の find() では、Employee の primaryKey を適切に切り替えることで、Employee を含めることができます。

    $this->Asistencia->Employee->primaryKey = 'id';

    $this->paginate = array(
        'contain' => array(
            'Employee' => array(
                'foreignKey' => 'employee_id',
                //'fields' => array('id', h('emp_ape_pat'), h('emp_ape_mat'), h('name')),
             'Horario' => array(
                    'foreignKey' => 'employee_id',
                //'fields' => array('id' )
            ))
        ),
        'conditions' => $conditions,
        'order' => 'Asistencia.employee_id');

ただし、私の Horario レコードは、別のフィールド emp_appserial を介して Employees にリンクされています。

Employee  : emp_appserial         =  373
Horario   : employee_id           =  373

Employee 配列に Horario 配列を含めるにはどうすればよいですか? (これらは、前述の値を共有しています)。

現在、Horario コンテンツは Asistencia.employee_id および Employee.id (3701) の値を使用しています。(sql_dumpをチェックし、Horarioを取得しようとしています

"WHERE `Horario`.`employee_id` = (3701)" 

ただし、Employee に Horario を含めるには、Employee.emp_appserial および Horario.employee_id (373) の値を使用する必要があります。

これは私が得るものです(下部の空の配列)

array(
(int) 0 => array(
    'Asistencia' => array(
        'id' => '5',
        'name' => null,
        'employee_id' => '3701',
        'as_date' => '2012-11-19',
    ),
    'Employee' => array(
        'id' => '3701',
        'emp_appserial' => '373',
        'emp_appstatus' => '8',
        'AgentFullName' => '3701 PEREZ LOMELI JORGE LORENZO',
        'FullNameNoId' => 'PEREZ LOMELI JORGE LORENZO',
        'Horario' => array()
    )))

注意してください:

'employee_id' => '3701',  (Asistencia)

'emp_appserial' => '373',  (Employee)

私の Horario には 'employee_id' = 373 があります。

リレーション Employee<->Horario が emp_appserial に基づくように切り替えるにはどうすればよいですか? よろしくお願いします。

4

1 に答える 1

0

まず、モデル名にスペイン語を使用していて、コントローラーにも使用していると思われるため、問題が発生する可能性があります。

CakePHP の考え方は次のとおりであるため、これは非常に悪い習慣です。

設定より規約。

これは、 「文字列を受け取り、それを操作して複数形やラクダ化などの単語のバリエーションを処理でき、通常は静的にアクセスされる」 Inflectorクラスによって実現されます。しかし、これは 英単語でのみ機能します。これが意味することは、スペイン語を使用しているため、Cake が DB クエリを正しく構築できないため、データが欠落している可能性があるということです。そうすることで、CakePHP の柔軟な永続レイヤーを使用しなくなります。すべての構成を手動で行う必要があります。また、ほとんどの場合、ページネーションは機能しません。フレームワークの他の部分も正しく動作しない可能性があります: HtmlHelper、FormHelper、Components など...

HABTM や「結合モデルによる hasMany」などのより複雑なモデルの関連付けを使用しようとすると、これらの問題が拡大します。ですから、あなたが記録を見ていない正確な理由はわかりませんHorarioが、私が説明したのはあなたの問題である可能性が最も高いです.

あなたがしようとしているのは、CakePHP のコア原則に反するものであり、少しリファクタリングして英語の単語を使用すれば、多くの問題を回避できます。他のオプションは Cake を使用しないことです。

于 2012-11-22T09:34:07.353 に答える