2

好吧,我彻底被难住了。我正在构建一个轻量级应用程序来帮助我的一个朋友处理他的业务。我不会详细介绍,但对于一些背景,他从几个品牌中获取组件并用这些组件构建一个小部件。

由于每个小部件都有多个组件,并且其中几个不同的组件选项由同一品牌制造,因此我想将品牌与组件分开,以便您可以轻松地按品牌查看产品。

我有以下表格

  • 品牌
  • 成分
  • 小部件

品牌包含“id”和“名称”组件包含“id”“模型”“brand_id”小部件包含“id”“compoennt_id”

品牌的显示字段是“名称” 组件的显示字段是“型号”

而这里的问题是,添加新产品时,蛋糕显然只会在表格中显示“模型”。我可以创建一个虚拟显示字段来显示以结合“brand_id”和“model”,但这并不能真正解决用户不知道该模型来自哪个品牌的问题。

看似懒惰的解决方案:一起删除品牌表并将该信息存储在组件表中。

有没有办法以不同的方式做到这一点,以便在添加新小部件时的表单中,他们可以在下拉框中看到“品牌模型”?

4

2 回答 2

1

我解决了一个类似的问题,但对我来说,有问题的模型没有有用的数据,我需要从其他两个相关模型中获取名称。我对 CakePHP 很陌生,所以我不能保证这个解决方案有多“合适”,它的扩展性如何等等......但它似乎有效。我也在 CakePHP 1.3 中使用它,所以我的解决方案甚至可能不适用于你。

无论如何,这是我添加到模型中的内容:

    function __construct($id = false, $table = null, $ds = null) {
            parent::__construct($id, $table, $ds);
            $list = parent::find('all', array('contain' => array(
                    'OtherModelA.name', 'OtherModelB.name')));
            if( !empty( $list) ) { //just in case there are no results
                    $this->virtualFields['name'] = sprintf("'%s - %s'",$list[0]['ProductionCompany']['name'],$list[0]['Musical']['name']);
                    $this->displayField = 'name';
            }
    }

编辑:当数据库完全为空时,我注意到一些错误,所以我添加了一个条件并将 displayField 移动到构造函数中。

于 2012-09-16T00:10:35.127 回答
1

我昨天花了太多时间研究同样的事情。

我认为你可以做的是在你的小部件模型中设置一个虚拟显示字段,它会在 book.cakephp.com 的这个部分的限制虚拟字段限制部分中建议执行类似的操作:

    $this->virtualFields['cool_display_name'] = 
        sprintf('CONCAT(%s.name, " - ", %s.model)', $this->Brands->alias, $this-  >Components->alias);

但是:除非您的“查找”功能在进行查询时收集到足够的数据,否则这将不起作用。find('list'),这可能是您对下拉列表的要求,它的默认递归设置为 -1,因此它不会向下遍历来获取它。我最终覆盖了在我的情况下是您的 Widget 模型的 find(),例如:

    public function find($type = 'first', $query = array()) {
    $return = array();
    switch ($type) {
        case 'list': // having to deal with a virtual field, seems like the least-messy workaround right now.
            $query['contain'] = 'User.full_name';
            $results = parent::find('all', $query);
            foreach($results as $k => $r) {
                $return[$r[$this->alias]['id']] = $r['User']['full_name'];
            }
            break;
        default:
            $return = parent::find($type, $query);
            break;
    }
    return $return;
}

我在那里所做的是手动构建元素列表框所期望的数组,就像: array( 'id' => 'display text') 你还会在那里看到我使用了 cakephp 的包含功能,所以不是所有的数据都被返回,而只是我需要的为了提供所有的虚拟场数据。

于 2012-05-16T16:51:55.103 回答