Phalcon模型关系的最佳实践

时间:2015-02-14 15:23:48

标签: phalcon

喜欢与Phalcon合作,但担心模型关系的最佳实践。例如,如果我有以下数据库关系:

http://i.imgur.com/8kZYomW.png

在Thing模型中创建一个关系,如:

public function initialize()
{
    $this->hasOne('categoryId', 'Categories', 'id', array('alias' => 'cat'));
}

以下内容很容易打印出来:

{{ thing.cat.name }}

鉴于pre-phalcon我会加入2进行1次往返,优雅的价值是2 DB的点击...

...直到你抓住一个说1000件事的清单并循环通过:

{{ for thing in things }}
    <li>{{ thing.cat.name }}</li>
{{ endfor }}

然后我得到1,001个DB呼叫(假设我猜有1000个不同的类别)。

处理此方案的最佳做法是什么?而不只是像这样的简单关系,其中查找可能是相当静态的并且易于缓存。那么您可能会在历史日期,客户和客户类别之间列出发票,从而建立更具活力的关系呢?

3 个答案:

答案 0 :(得分:1)

要构建更复杂的查询,您可能需要检查query builder examples

基本(未经测试)是:

$things = $this->modelsManager->createBuilder()
    ->from('Things', 'thing')
    ->leftJoin('Categories', 'category.id = thing.categoryId', 'category')
    ->getQuery()
    ->execute();

var_dump($things->toArray());

答案 1 :(得分:1)

添加'reusable' => true可能有所帮助。

public function initialize()
{
    $this->hasOne('categoryId', 'Categories', 'id', array(
        'alias' => 'cat', 'reusable' => true));
}

http://docs.phalconphp.com/en/latest/reference/models-cache.html#reusable-related-records

答案 2 :(得分:0)

我不是百分百肯定你在问什么。虽然如果我理解正确你在寻找类似的东西:

// Thing model
public function initialize()
{
    $this->belongsTo('categoryId', 'Categories', 'id');
}

// Category model
public function initialize()
{
    $this->hasMany('id', 'Things', 'categoryId', array('alias' => 'things'));
}

// Output things in certain category
foreach($category->things as $thing)
{
    echo $thing->name;
}

如果我完全误解了你的问题,我道歉。

希望它有所帮助!