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

CakePHP保存具有相似数据的模型,php,cakephp,cakephp-2.3,Php,Cakephp,Cakephp 2.3,我有以下代码。我正在努力使它更简单、更短。我创建了$data1数组,并使用array\u merge添加了相关数据,并将其保存到我的模型中。但是请注意,$data1和$exists中有相同的代码。是否可以将$data1数组传递给MyModel的find方法而不重写相同的代码 因为我需要在这些代码段中创建多行,所以我使用了MyModel->create。在这段代码中,我粘贴了两个块,但最初我有6个这样的块。所以缩短对我来说很重要 总结如下: 我需要缩短这个代码段,我不想在每个块中重写相同的数据

我有以下代码。我正在努力使它更简单、更短。我创建了
$data1
数组,并使用
array\u 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);
            }
        }

对于代码的优化,也许这不是一个最好的问题。还有其他的兄弟姐妹,比如。我只是建议,因为也许你会在那里找到更好或更专注的答案

但是,说到这里。在这种情况下,我通常做的是有一个这样的额外数组

$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'),
                 );
$data[$dbCondition] = $f;

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

还感谢您提供代码审阅链接。我不知道那个网站。
$data = array('userid' => $userid,
                      'date' =>  date('Y-m-d'),
                 );
$data[$dbCondition] = $f;