Phalcon 模型关系的最佳实践

Best practice for Phalcon model relationship

喜欢使用 Phalcon,但对模型关系的最佳实践有顾虑。例如,如果我有以下数据库关系:

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

并在事物模型中创建如下关系:

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

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

{{ thing.cat.name }}

虽然在 phalcon 之前我会加入 2 进行 1 次往返,但优雅值得 2 次 DB 命中...

... 直到您抓取了一个包含 1,000 件事物的列表并像这样循环:

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

然后我收到 1,001 个数据库调用(假设我猜有 1,000 个不同的类别)。

处理这种情况的最佳做法是什么?而不仅仅是像这样的简单关系,在这种关系中,查找可能是相当静态的并且易于缓存。如果您可以列出历史日期、他们的客户和客户类别之间的发票,那么更动态的关系怎么样?

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

// 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;
}

如果我完全误解了你的问题,我深表歉意。

希望对您有所帮助!

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

基本(未测试)是:

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

var_dump($things->toArray());

添加 '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