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


CakePHP saving models with similar data

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

因为我需要在这些代码片段中创建多行,所以我使用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);
            }
        }

对于代码的优化,也许这不是最好的问题。还有其他类似于SO的"兄弟",比如代码审查。我只是建议,因为也许你会在那里找到更好或更专门的答案。

但是,到目前为止。在这种情况下,我通常会做的是添加一个额外的数组,比如

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

技巧在于双$$(可变变量)和以适合您的方式组织$helper数组。我希望我讲得够清楚了