0

我有一些类别和项目给他们。我希望能够仅删除尚未设置项目的类别。例如,我有书籍类别,但没有添加具体书籍,因此我可以将其删除。我有食品类别,其中有比萨饼、三明治、苹果——所以我不能删除它。我在想如何最好地做到这一点。

<table class="table table table-striped spacer">
    {% for c in cat %}
        <tr>
            <td>
                {# If in edit mode, display edit form #}
                {% if id == c.id %}

                <form class="form-inline" action="{{ path('edit_category', {'id': c.id}) }}" method="post" {{ form_enctype(form) }}>

                    {% form_theme form 'EMBudgetTrackerBundle:Forms:inputs.html.twig' %}

                    {% for field in form %}
                    {{ form_row(field) }}
                    {% endfor %}

                    <button type="submit" class="btn"><i class="icon-ok"></i></button>

                </form>

                {# Else display the name #}
                {% else %}
                    {{ c.name }} 
                    <a href="{{ path('edit_category', {'id': c.id}) }}"><i class="icon-pencil"> </i></a> 
                    <a href="{{ path('delete_category', {'id': c.id}) }}"> <i class="icon-remove"></i></a> 
                {% endif %}
            </td>
        </tr>
    {% endfor %}
</table>

这就是我为每个类别所做的。我想要的是如果有添加的项目,不提供删除链接。我唯一能想到的就是有两个数组——一个是带有项目的类别,另一个是没有项目的类别,并且对于这两个数组都使用了这个 for 循环。但这会导致代码重复——一切都是一样的,只是一个循环没有<a href="{{ path('delete_category', {'id': c.id}) }}"> <i class="icon-remove"></i></a>这一行,而且看起来不太优雅。我在想类似的东西

if(c.name not member of array_with_categories_without_items) 
then display the delete link

但我不知道是否有办法做到这一点。有人可以给我一些想法吗?非常感谢您!:)

4

1 回答 1

1

根据您的应用程序,您可以做几件事。

我的偏好是显示所有类别的删除链接,并在您的实际删除页面上进行验证。这有几个额外的好处:

  • 让你在删除页面上思考这个逻辑。当用户删除一个类别时,许多人都陷入了隐藏他们忘记实际检查该逻辑的链接中。这意味着如果他们手动更改删除链接以将类别的 ID 包含在项目中,您的应用程序将很乐意将其删除。
  • 降低整个应用程序的复杂性。并不是说一个简单的 MySQL 查询会使您的应用程序更复杂,但它肯定有助于视图层在没有条件逻辑来显示链接的情况下表现得更干净一些
  • 减少服务器负载。在打印删除链接之前,您不必检查每个类别中的子项(尽管,根据您的设置,这可能是一个便宜的操作)
  • 它让用户知道发生了什么。否则,在不了解您的应用程序的情况下,他们会想知道为什么没有删除链接。有一个删除链接,如果他们单击它会显示错误,这将告诉他们如果他们想删除一个类别,他们需要删除所有子项。

话虽如此,您可以这样做:

SELECT
    c.category_name,
    c.category_id,
    COUNT(f.food_id) AS children
FROM 
    categories c
    LEFT JOIN food f ON (c.category_id = f.food_id)
GROUP BY
    c.category_id

这显然是在猜测您的数据库结构,但这将为您提供一个类别列表,其中每个类别都有一个子项

于 2013-02-05T13:37:39.723 回答