【问题标题】:CakePHP saving models with similar dataCakePHP 保存具有相似数据的模型
【发布时间】:2013-06-17 19:39:31
【问题描述】:

我有以下代码。我试图让它更简单更短。我创建了$data1 数组并使用array_merge 添加了相关数据并将其保存到我的模型中。但请注意 $data1$exists 内部有相同的代码。是否可以在不重写相同代码的情况下将$data1 数组传递给 MyModel 的 find 方法?

因为我需要在这些 sn-p 中创建多行,所以我使用了MyModel->create。在这段代码中,我粘贴了两个块,但最初我有 6 个这样的块。所以缩短对我来说很重要。

总结如下: 我需要缩短这段代码sn-p,我不想在每个块中重写相同的数据。

        $usersNew=array("mike", "john");
        $usersLost=array("anna", "maria");

        $data1 = array('userid' => $userid,
            'date' =>  date('Y-m-d')
        );

        foreach ($usersNew as $f) {
            $data2 = array_merge($data1, array("users_new" => $f));
            $exists=$this->MyModel->find('first',
                array('conditions' => array(
                    'MyModel.userid' => $userid,
                    'MyModel.date' => date('Y-m-d'),
                    'MyModel.users_new' => $f
                ) ));

            if ($exists == FALSE) {
                $this->MyModel->create();
                $this->MyModel->save($data2);
            }
        }

        foreach ($usersLost as $f) {
            $data2 = array_merge($data1, array("users_lost" => $f));
            $exists=$this->MyModel->find('first',
                array('conditions' => array(
                    'MyModel.userid' => $userid,
                    'MyModel.date' => date('Y-m-d'),
                    'MyModel.users_lost' => $f
                ) ));

            if ($exists == FALSE) {
                $this->MyModel->create();
                $this->MyModel->save($data2);
            }
        }

【问题讨论】:

    标签: php cakephp cakephp-2.3


    【解决方案1】:

    对于代码的优化,也许这不是问的最好的地方。 SO 还有其他“兄弟姐妹”,例如Code Review。我只是建议这样做,因为也许您会在那里找到更好或更专业的答案。

    但是,说到点子上了。在这种情况下,我通常会做一个像这样的额外数组

    $helper = array('usersNew'=>'users_new',
                    'usersLost'=>'users_lost',
                    /* name of array you want to loop => name of column in db */ );
    

    这就像拥有一个包含代码可变部分的数组。我正在使用您的确切代码,但如果您将来需要更复杂的东西,多维数组会更好。

    所以,你只做一个foreach 并遍历$helper 数组中的所有变量

        $usersNew=array("mike", "john");
        $usersLost=array("anna", "maria");
    
        //I prefer to avoid merge performance, so I'm deleting this, though it works
        /*$data1 = array('userid' => $userid,
                       'date' =>  date('Y-m-d')
        );*/
    
        foreach ($helper as $arrayName => $dbCondition) {
            foreach ($$arrayName as $f) {
                $data = array('userid' => $userid,
                              'date' =>  date('Y-m-d'),
                              $dbCondition => $f
                         );
                $exists = $this->MyModel->find('first',
                                         array('conditions' => array(
                                                     'MyModel.userid' => $userid,
                                                     'MyModel.date' => date('Y-m-d'),
                                                     'MyModel.'.$dbCondition => $f
                          ) ));
    
    
                if ($exists == FALSE) {
                    $this->MyModel->create();
                    $this->MyModel->save($data);
                }
    
           }
       }
    

    我还没有测试代码,但它应该可以在没有市长修改的情况下工作,也许是我缺少的结束 } 或类似的东西。

    如果由于某种原因,这段代码给你带来了问题(有时会发生在我身上)

    $data = array('userid' => $userid,
                          'date' =>  date('Y-m-d'),
                          $dbCondition => $f
                     );
    

    分两部分进行

    $data = array('userid' => $userid,
                          'date' =>  date('Y-m-d'),
                     );
    $data[$dbCondition] = $f;
    

    诀窍是双 $$ (variable variables) 并以适合您的方式组织 $helper 数组。我希望我已经说得够清楚了。

    【讨论】:

    • 也感谢您提供代码审查链接。我不知道那个网站。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    相关资源
    最近更新 更多