Phalcon & Volt:添加 hasMany()/belongsTo() 条件,并对链接的行进行计数
Phalcon & Volt: Adding hasMany()/belongsTo() conditions, and counting linked rows
我的数据库中有两个 table,form_settings
和 webmaster
,它们是一对多关系,这已在它们的模型中定义。
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 %}
我的问题分为三部分:
- 如何才能 只有 link
webmaster
列 extra_1
的行没有 NULL
?
- 如何为每个
db_table
(在 form_settings
中是唯一的)count()
编辑 webmaster
行?
- 如何将此信息传递到我的
$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
我的数据库中有两个 table,form_settings
和 webmaster
,它们是一对多关系,这已在它们的模型中定义。
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 %}
我的问题分为三部分:
- 如何才能 只有 link
webmaster
列extra_1
的行没有NULL
? - 如何为每个
db_table
(在form_settings
中是唯一的)count()
编辑webmaster
行? - 如何将此信息传递到我的
$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