0

私は CakePHP を使った最初のプロジェクトに取り組んでいます。基本的に、MySQL データベースに保存されているさまざまなワークアウトをユーザーが検索できるようにするサイトがあります。

ユーザーが検索語を入力すると、名前に検索語が含まれるワークアウトが返されます。その上で、フィルターを適用して特定の筋肉群に検索を絞り込めるようにしてほしい.

フィルターはクエリ文字列を介して検索アクションに渡され、検索語は post メソッドを使用して渡されます。

まず、私が今気になっているモデルは以下の2つです。

class Workout extends AppModel {
    public $name = 'Workout';
    public $hasAndBelongsToMany = array(
        'MuscleGroup' =>
            array(
                'className'              => 'MuscleGroup',
                'joinTable'              => 'workouts_muscle_groups',
                'foreignKey'             => 'workout_id',
                'associationForeignKey'  => 'muscle_group_id',
                'unique'                 => true,
                'conditions'             => '',
                'fields'                 => '',
                'order'                  => '',
                'limit'                  => '',
                'offset'                 => '',
                'finderQuery'            => '',
                'deleteQuery'            => '',
                'insertQuery'            => ''
            )
    );
}


class MuscleGroup extends AppModel {
    public $name = 'MuscleGroup';
    public $hasAndBelongsToMany = array(
        'Workout' =>
            array(
                'className'              => 'Workout',
                'joinTable'              => 'workouts_muscle_groups',
                'foreignKey'             => 'muscle_group_id',
                'associationForeignKey'  => 'workout_id',
                'unique'                 => true,
                'conditions'             => '',
                'fields'                 => '',
                'order'                  => '',
                'limit'                  => '',
                'offset'                 => '',
                'finderQuery'            => '',
                'deleteQuery'            => '',
                'insertQuery'            => ''
            )
    );
}

以下は、私の WorkoutsController での検索アクションです。

function search() {
    $hasFilters = false;
    $filters = array(
        "abs" => false, 
        "back" => false, 
        "biceps" => false, 
        "chest" => false, 
        "forearms" => false, 
        "legs" => false, 
        "shoulders" => false, 
        "triceps" => false
    );

    if(isset($this->params['url']['abs']))
        if($this->params['url']['abs'] == "1")
            $filters['abs'] = $hasFilters = true;
    if(isset($this->params['url']['back']))
        if($this->params['url']['back'] == "1")
            $filters['back'] = $hasFilters = true;
    if(isset($this->params['url']['biceps']))
        if($this->params['url']['biceps'] == "1")
            $filters['biceps'] = $hasFilters = true;
    if(isset($this->params['url']['chest']))
        if($this->params['url']['chest'] == "1")
            $filters['chest'] = $hasFilters = true;
    if(isset($this->params['url']['forearms']))
        if($this->params['url']['forearms'] == "1")
            $filters['forearms'] = $hasFilters = true;
    if(isset($this->params['url']['legs']))
        if($this->params['url']['legs'] == "1")
            $filters['legs'] = $hasFilters = true;
    if(isset($this->params['url']['shoulders']))
        if($this->params['url']['shoulders'] == "1")
            $filters['shoulders'] = $hasFilters = true;
    if(isset($this->params['url']['triceps']))
        if($this->params['url']['triceps'] == "1")
            $filters['triceps'] = $hasFilters = true;


    $query = $this->request->data['search'];

    //insert code here to actually perform the search!     

}

これを行う簡単な方法を本当に望んでいましたが、一晩中ドキュメントを調べていて、関連する例が見つからないようです。EntityFramework では、次のように簡単に言えます。

List<Workout> results = context.Workouts.Where(w => w.Name.Contains(searchTerm) && w.MuscleGroups.Any(g => g.Id == mg_id)).ToList();

注: C# の構文がほぼ正しいかどうかはわかりませんが、モデルからのデータへのアクセスのしやすさは、私が覚えているものに近いものでした。

CakePHP から同等のものを取得するにはどうすればよいですか?

4

1 に答える 1

0

名前の代わりに、MuscleGroup ID をフィルタリングに使用してみてください。とにかく、ユーザーはリストからそれらを選択すると思います。

次に、 は次のfind()ように動作するはずです。

$this->Workout->find(
    'all',
    array(
        'conditions' => array(
            'Workout.name LIKE' => '%'.$searchTerm.'%',
            // List of included MuscleGroups:
            'MuscleGroup.id' => array(1, 5, 9, 17)  
        )   
    )   
);

$this->Workout->recursive = 1より柔軟な ContainableBehavior を設定するか (推奨) 使用して、関連する MuscleGroup がワークアウト クエリに含まれるように注意する必要があることに注意してください。

于 2012-06-17T10:54:03.297 に答える