1

検索プラグインを使用して検索関連のモデルを動作させるコードを持っていますが、モデルの関連付けの構造を壊さなければなりません。その結果、保存および編集機能が正しく機能しません。

これが私のデータの構造です。

モデル:

public $belongsTo = array(
    'Movie' => array(
        'className' => 'Movie',
        'foreignKey' => 'movie_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
        'MovieStarRecurrance' => array(
        'className' => 'MovieStarRecurrance',
        'foreignKey' => 'movie_star_recurrance_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'MovieStarType' => array(
        'className' => 'MovieStarType',
        'foreignKey' => 'movie_star_type_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
);
public $hasMany = array(
    'MovieStarLine' => array(
    'className' => 'MovieStarLine',
    'foreignKey' => 'movie_star_id',
    'dependent' => false,
    'conditions' => '',
    'fields' => '',
    'order' => 'status_date',
    'limit' => '',
    'offset' => '',
    'exclusive' => '',
    'finderQuery' => '',
    'counterQuery' => ''
    ),
);

関連モデルのムービーとムービーが属するユーザー内で検索とフィルタリングを行っています。

public $filterArgs = array(
    'parent_user_id'     => array('type' => 'like', 'field' => 'User.parent_user_id'),
    'initials'   => array('type' => 'value', 'field' => 'User.id'),
    'trace'  => array('type' => 'like', 'field' => 'MovieStar.trace'),
    'movie'  => array('type' => 'query', 'method' => 'orConditionsMovie'),
    'star_type'  => array('type' => 'value', 'field' => 'MovieStar.movie_star_type_id'),
    'code'   => array('type' => 'value', 'field' => 'MovieStar.code'),
    'status'     => array('type' => 'value', 'field' => 'MovieStarLine.movie_star_status_id'),
    'open'   => array('type' => 'value', 'field' => 'MovieStar.open'),
    'from_date'  => array('type' => 'query', 'method' => 'orConditionsFromDate'),
    'end_date'   => array('type' => 'query', 'method' => 'orConditionsEndDate'),
);

検索の最上位でこれらのモデルにアクセスするために、Movie モデルの belongsTo 関連付けをアンバインドし、hasOne として再バインドします。MovieStarLine と MovieStarStatus についても同じことを行います。

コントローラ:

    $this->MovieStar->recursive = 0;

    $this->MovieStar->unbindModel( array(
    'belongsTo' => array('Movie')
        )
    );

    // MovieStarStatus to be top level json element
    $this->MovieStar->bindModel( array(
        'hasOne' => array(
            'Movie' => array(
                'foreignKey' => false,
                'conditions' => array('Movie.id = MovieStar.movie_id'),
                'fields' => array('Movie.id', 'Movie.movie_id', 'Movie.user_id', 'Movie.movie_mid', 'Movie.movie_dba')
            ),
            'User' => array(
                'foreignKey' => false,
                'conditions' => array('Movie.user_id = User.id'),
                'fields' => array('User.id', 'User.initials', 'User.user_first_name', 'User.user_last_name', 'User.name', 'User.parent_user_id', 'User.secondary_parent_user_id')
            ),
            'MovieStarLine' => array(
                'foreignKey' => false,
                'conditions' => array('MovieStarLine.movie_star_id = MovieStar.id',
                            'MovieStarLine.id = (SELECT id FROM "public"."movie_star_lines" AS "MovieStarLine" WHERE movie_star_id = MovieStar.id ORDER BY status_date DESC NULLS LAST, id DESC LIMIT 1)'  // Get only most recent line     
                        ),
                'order' => array( 'MovieStarLine.status_date' => 'DESC  NULLS LAST')    
            ),
            'MovieStarStatus' => array(
                'foreignKey' => false,
                'conditions' => array('MovieStarLine.movie_star_status_id = MovieStarStatus.id'),
            ),
        ),
    ));

    $this->MovieStar->contain(array(
        'Movie', 
        'MovieStarLine' => array('MovieStarStatus'), 
        'MovieStarType', 
        'MovieStarRecurrance', 
        'User', 
        'MovieStarStatus'
    ));


    // This is where the search filter occurs
    $this->Prg->commonProcess();
    $this->paginate = array( 'conditions' => $this->MovieStar->parseCriteria($this->Prg->parsedParams()), 'limit' => 100);
    $movieStars = $this->paginate();
    $this->set(compact('movieStars'));

}

問題は、parent_user_id またはイニシャルで検索しようとすると、「ERROR: missing FROM-clause entry for table "User".」というメッセージが表示されることです。

動的バインディングが機能していないようです。私は属しているから映画を削除する必要があります

モデル:

public $belongsTo = array(

    //'Movie' => array(
    //  'className' => 'Movie',
    //  'foreignKey' => 'movie_id',
    //  'conditions' => '',
    //  'fields' => '',
    //  'order' => ''
    //),
    'MovieStarRecurrance' => array(
        'className' => 'MovieStarRecurrance',
        'foreignKey' => 'movie_star_recurrance_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'MovieStarType' => array(
        'className' => 'MovieStarType',
        'foreignKey' => 'movie_star_type_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
);

検索が機能するように、ムービーとユーザーに hasOne を追加します。

public $hasOne = array(
    'Movie' => array(
                'foreignKey' => false,
                'conditions' => array('Movie.id = MovieStar.movie_id'),
                'fields' => array('Movie.id', 'Movie.movie_id', 'Movie.user_id', 'Movie.movie_mid', 'Movie.movie_dba')
            ),
    'User' => array(
                'foreignKey' => false,
                'conditions' => array('Movie.user_id = User.id'),
                'fields' => array('User.id', 'User.initials', 'User.user_first_name', 'User.user_last_name', 'User.name', 'User.parent_user_id', 'User.secondary_parent_user_id')
            ),
    'MovieStarLine' => array(
                'foreignKey' => false,
                'conditions' => array('MovieStarLine.movie_star_id = MovieStar.id',
                            'MovieStarLine.id = (SELECT id FROM "public"."movie_star_lines" AS "MovieStarLine" WHERE movie_star_id = MovieStar.id ORDER BY status_date DESC NULLS LAST, id DESC LIMIT 1)'  // Get only most recent line     
                        ),
                //'order' => array( 'MovieStarLine.status_date' => 'DESC  NULLS LAST')  
            ),
);

ただし、保存および編集機能がすべて壊れるため、これを行うことはできません。関連付けを適切に再バインドする方法を知っている人はいますか?

##################### アップデート

User モデルが表示されないように見える部分的な解決策を見つけました。

「Model::bindModel 呼び出しの 2 番目のパラメーターとして false を渡します。これにより、オンザフライ バインディングが要求の間持続します。」この答えから。.

これでバインディングが修正された可能性がありますが、カウントとグループ化でエラーが発生したため、まだわかりません。

エラー: 列 "MovieStarLine.status_date" は GROUP BY 句に含めるか、集計で使用する必要があります

SQL クエリ: SELECT COUNT(*) AS "count"

$this->MovieStar->unbindModel( array(
'belongsTo' => array('Movie')
    ), false
);

// MovieStarStatus to be top level json element
$this->MovieStar->bindModel( array(
    'hasOne' => array(
        'Movie' => array(
            'foreignKey' => false,
            'conditions' => array('Movie.id = MovieStar.movie_id'),
            'fields' => array('Movie.id', 'Movie.movie_id', 'Movie.user_id', 'Movie.movie_mid', 'Movie.movie_dba')
        ),
        'User' => array(
            'foreignKey' => false,
            'conditions' => array('Movie.user_id = User.id'),
            'fields' => array('User.id', 'User.initials', 'User.user_first_name', 'User.user_last_name', 'User.name', 'User.parent_user_id', 'User.secondary_parent_user_id')
        ),
        'MovieStarLine' => array(
            'foreignKey' => false,
            'conditions' => array('MovieStarLine.movie_star_id = MovieStar.id',
                        'MovieStarLine.id = (SELECT id FROM "public"."movie_star_lines" AS "MovieStarLine" WHERE movie_star_id = MovieStar.id ORDER BY status_date DESC NULLS LAST, id DESC LIMIT 1)'  // Get only most recent line     
                    ),
            'order' => array( 'MovieStarLine.status_date' => 'DESC  NULLS LAST')    
        ),
        'MovieStarStatus' => array(
            'foreignKey' => false,
            'conditions' => array('MovieStarLine.movie_star_status_id = MovieStarStatus.id'),
        ),
    ),
), false);
4

0 に答える 0