hasMany与条件的关系

hasMany relationship with conditions

这个主题可能是一个常见问题,但我有一个更深层次的问题。我是 CakePhp 的新生,已经用谷歌搜索了这个问题。不幸的是我找不到我的确切解决方案。

我的数据库结构如下,有两个表,我使用了 cakePhp 命名约定:

- news (id, news_title, news_text, is_active, created, modified)

- news_images (id, news_id, image_src, is_default, created, modified)

Each news has many images. But one image is being selected as default to-be used as a thumbnail in homepage.

在新闻列表页面中,我想用缩略图列出所有新闻。 缩略图表示,news_images.is_default=true

所以我必须建立 hasMany 关系,但使用 is_default=true

进行过滤

如果我只是在 hasMany 和 belongsTo 关系之后获取数据而不使用任何条件,它会检索所有图像。而且我对 cakePhp 还太陌生,所以无法成功使用 bingModal 或容器。

我想请求你的帮助。 提前致谢。

数据库:

(在table中imagesnews_id是外键)

型号新闻 (news.php):

public $hasMany = array(
    'Image' => array(
        'className' => 'Image',
        'foreignKey' => 'news_id',
        'dependent' => false,
    )
);


型号图片 (image.php):

public $belongsTo = array(
    'News' => array(
        'className' => 'News',
        'foreignKey' => 'news_id',
    )
);

有两种主要方法可以完成您想要的。

A:查找包含条件

$data = $this->News->find('all', array(
    'contain' => array(
        'NewsImage' => array(
            'conditions' => array(
                'is_default' => true
            )
        )
    )
));

B:将第二个关联添加到具有条件的新闻模型

如果您要在多个地方执行此查找调用,这是更好的方法。

在模型中 新闻 (news.php):

public $hasMany = array(
    'Image' => array(
        'className' => 'Image',
        'foreignKey' => 'news_id',
        'dependent' => false,
    ),
    'NewsThumbnail' => array(
        'className' => 'NewsImage',
        'foreignKey' => 'news_id',
        'conditions' => array('is_default' => true),
        'dependent' => false,
    )
);

现在您可以查找包含 NewsThumbnail 的新闻,条件将自动应用。

$data = $this->News->find('all', array(
    'contain' => array(
        'NewsThumbnail'
    )
));

注意:如果您在此处添加更多条件,它们将覆盖模型关联中设置的条件,因此您必须再次包含它们。

谢谢。我正在用你的完美技巧在 CakePhp 中提高自己。尝试结合提示。

1) 根据@DoNhuVy 的提议重新构建数据库:
news: id, title.., news_image_id
news_images: id, src.., news_id

2) 然后使用你的模型如下@corie-slate

class News extends AppModel {
 public $hasMany = array(
  'Image' => array(
   'className' => 'Image',
   'foreignKey' => 'entry_id',
   'dependent' => false),
  'NewsThumbnail' => array(
   'className' => 'NewsImage',
   'foreignKey' => 'entry_id',
   'dependent' => false));
}

到这里,一切都好了吗?