我有2个表(1-n关系,“关键字”有很多“KeywordData”),它们被YYYYMM拆分。它们位于同一个数据库中。
示例,2014年1月的记录位于keyword_201401& keyword_data_201401。 2014年2月记录在keyword_201402& keyword_data_201402
如何在模型中定义表名,以便从正确的_YYYYMM表中写入/读取值?
keyword_201401 (keyword_id, keyword, date)
keyword_data_201401 (data_id, keyword_id, source)
keyword_201402 (keyword_id, keyword, date)
keyword_data_201402 (data_id, keyword_id, source)
感谢。
答案 0 :(得分:0)
这听起来像是setSource()的工作。
您可以在模型中指定特定的表格(Keywords.php),如:
$this->setSource('keyword_201402');
虽然不够好,对吧?如果您希望它是动态的,您可以执行以下操作:
// Keyword.php
function getAllKeywordsByDate($date) {
// $date might be 201401 or 201402
$this->setSource('keywords_' . $date);
// find the keywords from the table based on the date
$keywords = $this->find();
// pass keywords to keyworddata to get related models
$dataset = (new KeywordData)->mergeKeywordAndKeywordData($keywords, $date);
// send the full dataset back
return $dataset;
}
// KeywordData.php
function mergeKeywordAndKeywordData($keywords, $date) {
// $data might be 201401 or 201402
$this->setSource('keyword_data_' . $date);
$dataset = array();
// find the keyword data from the table based on the date
foreach ($keywords as $keyword) {
$dataset[] = array(
'keyword' => $keyword,
'keyword_data' => $this->findByKeywordId($keyword->keyword_id)
);
}
return $dataset;
}
你最终会得到一个数组,但是,这应该非常接近你所需要的。它的效率并不比普通模型低,因为1-n关系的性质是每个唯一ID记录的新查询。
所以,最后,在你的实现中,你最终会做:
$keywords = (new Keyword)->getAllKeywordsByDate('201401');
可以通过以下方式进行交流:
foreach ($keywords as $keyword) {
print_r($keyword['keyword']); // keyword model ($keyword['keyword']->keyword)
print_r($keyword['keyword_data']); // same /\
}