我正在使用Symfony 1.4和Doctrine。
假设我有两个类:品牌和产品。
当我在基于管理生成器的管理员中创建新产品时,我想从下拉列表中选择一个品牌。
Admin Generator正在为我这样做,自动创建sfWidgetFormDoctrineChoice
。
问题在于品牌是按ID订购的。我希望他们可以通过他们的“标签”字段来订购。
为了做到这一点,我在ProductForm
课程中做了以下几点:
$this->widgetSchema['brand_id']->addOption('order_by','label');
但是我收到以下错误:
语法错误或访问冲突:1064 您的SQL语法有错误; 检查对应的手册 您的MySQL服务器版本 正确的语法在'a'附近使用 1.查询失败:“SELECT b.id AS b__id,b.external_id AS b__external_id,b .label AS b__label, b.created_at AS b__created_at, b.updated_at AS b__updated_at FROM 品牌b订购“
order by statement非常奇怪。我不明白为什么它似乎用声明来削减订单的名称。
编辑:显然'order_by'选项期望数组作为第二个参数。它期望什么价值?
答案 0 :(得分:18)
我没有尝试过benlumley的解决方案,因为他在我找到解决方案时回答正确。这似乎比我结束时更乏味。
我看了一下源代码,弄清楚这一切是如何起作用的。 事实证明,“order_by”选项需要一个数组,指定想要对结果进行排序的字段以及'asc'或'desc':
$this->widgetSchema['product_id']->addOption('order_by',array('label','asc'));
它就像一个魅力。
答案 1 :(得分:2)
你应该看看这里:
http://trac.symfony-project.org/wiki/HowtoSortAdminGeneratorListByForeignTableName
它基于旧版本的symfony,所以怀疑它链接的插件不起作用。但我认为该方法应该仍然合理 - 关键是你必须在动作中添加方法来拦截和修改这个特定字段的排序默认处理:
对于教义,您需要为propel,addSortCriteria定义/覆盖addSortQuery。
建议您查看缓存文件夹,了解自动生成的类的外观,了解其工作原理。