添加到中可容纳的条件CakePHP中(Adding conditions to Containabl

2019-09-23 23:31发布

以前我是依靠递归的,但我没有对一些得到解决,后来我发现中可容纳正常工作对这些。

我正在开发一个电影评论网站。 在我需要证明这是关系到一个特定类型的电影名单。

我有这样的代码如下:

//example
$genre = "drama";

$options = array(
    'contain' => array(
        'Movie',
        'MoveiGenre.Genre' => array(
            'conditions' => array('MovieGenre.Genre.name = "'.$genre.'"')
        ),
        'MovieGenre.Genre.name'
    ),
    'recursive' => 2,
    'limit' => 10
);
$this->paginate = $options;
$this->set('movies',$this->paginate());

真正的问题从这里开始,我得到的所有的电影,即使其不相关类型为“戏剧”。 我要去哪里错了?

让我来解释数据库表:

表:电影

 ----------------------------
 | id | title | description |
 ----------------------------
 | 1  | mov1  | something1  |
 | 2  | mov2  | something2  |
 | 3  | mov3  | something3  |
 ----------------------------

表:流派

 ---------------
 | id | name   |
 ---------------
 | 1  | drama  |
 | 2  | sci-fi |
 | 3  | comedy |
 ---------------

表:movie_genres

 -------------------------------
 | id | movie_id | genre_id    |
 -------------------------------
 | 1  | 1        | 1           |
 | 2  | 1        | 2           |
 | 3  | 2        | 2           |
 -------------------------------

在这里,你可以看到一个movie_id有多个genre_id。 我应该得到的只有mov1但我在一个阵列获得两部电影。

~~ ~~ 编辑哎呀! 抱歉,忘了提,我使用这个代码MoviesController 。 所有3表具有相应的控制器。 所以,请给我建议,在其中控制器我可以使用。

编辑:2

class Movie extends AppModel {
    public $displayField = 'title';

    public $actsAs = array('Containable');

    public $hasMany = array(
        'MovieGenre' => array(
            'className' => 'MovieGenre',
            'foreignKey' => 'movie_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
        'MovieLanguage' => array(
            'className' => 'MovieLanguage',
            'foreignKey' => 'movie_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
    );

}

型号:类型

class Genre extends AppModel {

    public $displayField = 'name';

    public $hasAndBelongsToMany = array(
        'Movie' => array(
            'className' => 'Movie',
            'joinTable' => 'movie_genres',
            'foreignKey' => 'genre_id',
            'associationForeignKey' => 'movie_id',
            'unique' => 'keepExisting',
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'finderQuery' => '',
            'deleteQuery' => '',
            'insertQuery' => ''
        )
    );

}

型号:MovieGenre

class MovieGenre extends AppModel {

    public $belongsTo = array(
        'Movie' => array(
            'className' => 'Movie',
            'foreignKey' => 'movie_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'Genre' => array(
            'className' => 'Genre',
            'foreignKey' => 'genre_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );
}

Answer 1:

TLDR:做你的体裁查找和包含它的电影,或使用连接() -做你的电影搜索和含体裁与条件不会为你想要的结果工作。


说明:

下面是你的纠正“包含”代码,但更重要的是,做一个“包含”体裁不会回到你正在寻找的结果。

它能做什么-限制根据你的病情所包含的类型...所以它会拉所有的电影,并包含匹配的流派$genre


解决方案(根据您的需要):

解决方法1)

  • 做一个find()的类型,条件,以及包含它的电影。 这将拉动相匹配的风格,那么只有那些与之相关的电影。

解决方案2) -一个我会建议

  • 使用 '连接()':

$conditions = array();
$conditions['joins'] = array(
    array(
        'table' => 'genres_movies', //or movie_genres if you've specified it as the table to use
        'alias' => 'GenresMovie',
        'type' => 'INNER'
        'conditions' => array(
            'GenresMovie.movie_id = Movie.id'
        )
    ),
    array(
        'table' => 'genres',
        'alias' => 'Genre',
        'type' => 'INNER',
        'conditions' => array(
            'Genre.id = GenresMovie.genre_id',
            'Genre.name = "' . $genre . '"'
        )
    )
);
$this->Movie->find('all', $conditions);

已修改的(IMO校正)“包含”例如

//edited example
$genre = "drama";

$options = array(
    'contain' => array(
        'Genre' => array(
            'conditions' => array('Genre.name' => $genre)
        )
    ),
    'recursive' => -1,
    'limit' => 10
);
$this->paginate = $options;
$this->set('movies', $this->paginate('Movie'));
  1. 你不“遏制”的模式你在(即我删除了“电影”从包含阵列)做的发现。
  2. 你只包含模型,而不是像“MovieGenre.Genre”(我想不出你会随时使用“”连接起来型号)
  3. 递归需求为-1使用中可容纳 - 你应该在这个AppModel设置为-1,忘掉了递归的概念 - 它是坏的


文章来源: Adding conditions to Containable in CakePHP