Phalcon模型 - 由YYYYMM拆分的相同表结构

时间:2014-01-15 09:57:18

标签: phalcon

我有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)

感谢。

1 个答案:

答案 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 /\
}