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

时间:2016-08-23 14:43:30

标签: php phalcon volt

我的数据库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');
    }
}

在我的Controller中,我执行以下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;
    }
}

我知道它正确地链接了我的webmaster表格中的行,因为我在视图中有以下代码,并显示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. 如何链接webmasterextra_1而不是NULL
  2. 我如何count()每个webmaster的{​​{1}}行(db_table中的唯一行)?
  3. 如何将此信息传递到我的form_settings对象中的视图,以便我可以用Volt语法回显$exhibitions

1 个答案:

答案 0 :(得分:1)

嘿,首先感谢格式化的好问题。

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

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 %}

我的上述代码产生以下输出:

  

类别#4共有4篇文章。

          
  • 新闻#3
  •       
  • 新闻#4
  •       
  • 新闻#5
  •       
  • 新闻#7

类别#5共有1篇文章。

          
  • 新闻#1