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中images
,news_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));
}
到这里,一切都好了吗?
这个主题可能是一个常见问题,但我有一个更深层次的问题。我是 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中images
,news_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));
}
到这里,一切都好了吗?