CakePHP保存具有类似数据的模型

时间:2013-06-17 19:39:31

标签: php cakephp cakephp-2.3

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

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

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

        $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);
            }
        }

1 个答案:

答案 0 :(得分:1)

为了优化代码,也许这不是最好的问题。还有其他“兄弟姐妹”,就像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数组。我希望我说得够清楚。