Phalcon & Volt:添加 hasMany()/belongsTo() 条件,并对链接的行进行计数

Phalcon & Volt: Adding hasMany()/belongsTo() conditions, and counting linked rows

我的数据库中有两个 table,form_settingswebmaster,它们是一对多关系,这已在它们的模型中定义。

FormSettings.php

class FormSettings extends \Phalcon\Mvc\Model
{    
    public function initialize()
    {
        $this->hasMany('db_table', 'webmaster', 'db_table');
    }
}

Webmaster.php

class FormSettings extends \Phalcon\Mvc\Model
{    
    public function initialize()
    {
        $this->belongsTo('db_table', 'form_settings', 'db_table');
    }
}

在我的控制器中,我执行以下操作 find() 并将其传递给视图:

ControllerBase.php

class ControllerBase extends Controller
{
    public function initialize()
    {
        $exhibitions = FormSettings::find(
            array(
                'form_type = "v" AND show_end_date > NOW() AND archived = "n"',
                'order' => 'db_table'
            )
        );

        $this->view->exhibitions = $exhibitions;
    }
}

而且我知道它正确地 linking 来自我的 webmaster table 的行,因为我的视图中有以下代码,它显示 webmaster_id 值:

index.volt

{% for exhibition in exhibitions %}
    <li>
        {{ link_to('index/browse/' ~ exhibition.db_table, exhibition.db_table) }}
        <!-- testing below -->
        {% for webm in exhibition.webmaster %}
            {{ webm.webmaster_id }}
        {% endfor %}
        <!-- end testing -->
    </li>
{% endfor %}

我的问题分为三部分:

  1. 如何才能 只有 link webmasterextra_1 的行没有 NULL
  2. 如何为每个 db_table(在 form_settings 中是唯一的)count() 编辑 webmaster 行?
  3. 如何将此信息传递到我的 $exhibitions 对象中的视图,以便我可以在 Volt 语法中回显 count()

您好,首先感谢您提出很好的问题格式。

请原谅我使用了使用我当前数据库结构的示例。但是您可以轻松更新您的代码。

1) 您可以为关系定义设置附加参数。

$this->hasMany('id', 'Models\News', 'category_id', [
    'alias' => 'news',
    'reusable' => true, 
    'params' => [
        'order' => 'id DESC',
        'conditions' => 'extra_1 IS NOT NULL',
    ]
]);

请注意上面的reusable。使用它时,查询每个请求只运行一次。考虑到您想对记录进行计数并对其进行迭代,这是一个很好的性能提升。

2 + 3) 迭代结果为伏特和计数:

控制器代码:

$this->view->categories = \Models\NewsCategories::find();

电压:

{% for category in categories %}
    {% if category.news|length > 0 %} // Do not print categories without articles
    <h3>Category #{{ category.id }} with total of {{ category.news|length }} articles.</h3>
    <ul>
    {% for item in category.news %}
        <li>News #{{ item.id }}</li>
    {% endfor %}
    </ul>
    {% endif %}
{% endfor %}

以上代码在我的案例中产生以下输出:

Category #4 with total of 4 articles.

  • News #3
  • News #4
  • News #5
  • News #7

Category #5 with total of 1 articles.

  • News #1