cakephp HABTM数据库上传无法找到问题

时间:2011-10-06 10:36:28

标签: cakephp upload bulkinsert has-and-belongs-to-many

我是CakePHP的新手,也是PHP的新手,我已经浏览了一些Youtube视频,以帮助我建立一个基本网站设置CRUD页面的一切。我现在正在尝试设置用户注册页面,将一堆内容添加到HABTM表中,但无法弄清楚出现了什么问题。

$this->User->create();
        if ($this->User->save($this->data)) {
            $lvl = $this->data['User']['level'];
            $charids = $this->Kanji->find('list',array('conditions'=>array('grade' <= $lvl,'grade' >= 0)));
            foreach ($charids as $charid){
                $characterList = array('kanji_id'=>$charid,'user_id'=>$this->User->id, 'level'=>2);

                $this->kanjisUsers->save($characterList);

有点澄清,该网站是针对学校项目的,我希望它可以帮助学习日语,并且想法是你可以放一串日文文本,它会将它简化到你的水平所以当你注册你告诉它你的日语水平是什么(1到9之间的int)然后它将通过角色列表(kanjis表)并找到所有数字等于或小于你的水平(在kanjis中称为'等级') table)然后我希望它将所有这些添加到kanjis_users表中,并使用int 2表示它已知(然后我将再次使用一个级别的字符并使用int 1保存它们以进行'学习') 我得到了代码的帮助,我不确定它是如何工作的,我一直在改变很多东西,不知道出了什么问题,有什么建议吗?

注意:我也看到模型被称为kanjis_user.php和KanjisUser,我读的模型不应该是复数但是当我试图改变它时,一切都崩溃了,这可能是问题的一部分吗? 我也试过改变=&gt;用 - &gt;反之亦然,还创建了$ characterList将其从保存功能中删除,不知道这些是否影响了它从未起作用......

编辑以回应api55的评论:

以下是kanjis_users的模型关系:

class KanjisUser extends AppModel {
    var $name = 'KanjisUser';
//Validation stuff here
var $belongsTo = array(
        'Kanji' => array(
            'className' => 'Kanji',
            'foreignKey' => 'kanji_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        ),
        'User' => array(
            'className' => 'User',
            'foreignKey' => 'user_id',
            'conditions' => '',
            'fields' => '',
            'order' => ''
        )
    );

这是汉字模式:

var $hasAndBelongsToMany = array(
    'User' => array(
        'className' => 'User',
        'joinTable' => 'kanjis_users',
        'foreignKey' => 'kanji_id',
        'associationForeignKey' => 'user_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    )
);

以下是用户模型:

var $hasAndBelongsToMany = array(
    'Kanji' => array(
        'className' => 'Kanji',
        'joinTable' => 'kanjis_users',
        'foreignKey' => 'user_id',
        'associationForeignKey' => 'kanji_id',
        'unique' => true,
        'conditions' => '',
        'fields' => '',
        'order' => '',
        'limit' => '',
        'offset' => '',
        'finderQuery' => '',
        'deleteQuery' => '',
        'insertQuery' => ''
    ),

这只是标准生成的模型(减去验证)。

为了澄清错误,没有错误,它只是不起作用,它保存了用户,但没有添加任何东西到kanjis_users表。这是现在的整个寄存器控制器:

function register() {
    if (!empty($this->data)) {


        $this->User->create();
        if ($this->User->save($this->data)) {
            $lvl = $this->data['User']['level'];
            //$test = $this->Kanji->find ('list',array('Kanji.grade <='<=$lvl, 'AND'=>array('Kanji.grade >=' >= 1)));
            $charids = $this->Kanji->find('list',array('conditions'=>array('grade <=' => $lvl,'grade >=' >= 1)));
            //print_r($charids);
            //exit();
            //$this->kanjisUsers->save(array('kanji_id'=>$charids,'user_id'=>$this->User->id));
            //$this->kanjisUsers->saveALL(array('kanji_id'=>$charids,'user_id'=>$this->User->id));
            foreach ($charids as $charid){
                //echo("<p>Charid: ".$charid." is: </p>");
                //var_dump($charid);
                $this->kanjisUsers->save(array('kanji_id'=>$charid,'user_id'=>$this->User->id),'level'=> 2);
            }

        //exit();

        $this->Session->setFlash(__('The user has been saved', true));
        $this->redirect(array('action' => 'index'));
        } else {
            $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
        }
    }

}

两者似乎都生成了一个类似的数组,但是我有时会更改代码会崩溃,有时它会保存用户,但它永远不会对kanjis_users表做任何事情。

我想要的是:(为简洁起见,简化了:

用户表有:name,username,pw,userID等... kanjis表有:每行一个中文字符,ID,英文,等级(int从0到9)等... kanjis_users有:ID,user_id,kanji_id,created(日期),modified(日期),level(int)。

我希望用户在注册时放置一个级别,然后在创建用户时,它将填充kanjis_users表,其中汉字表中的所有行的“等级”介于1和用户放置的级别之间在注册表格中(称为“级别”)。

所以我上面尝试的是在用户保存之后(这个用户在顶部创建()),然后测试保存是否成功然后获取用户放在表单中的级别,并且尝试从kanjis表中的行中获取所有字符,其中级别等于或小于该值(注意我不想得到0,因为它们是最难的...)并将它们全部添加到kanjis_users表。 (这仅用于注册,当使用系统时,用户可以按照自己的意愿添加和删除字符)

我注意到print_r它从kanjis表中得到了所有12000行,所以我认为过滤器没有工作......

我希望这是有道理的,如果我需要提供任何进一步的信息,请告诉我。

2 个答案:

答案 0 :(得分:0)

在寄存器视图中创建一个输入框:

$this->Form->input('Kanji', array('type' => 'hidden'));

然后试试这个:

function register() {
if (!empty($this->data)) {
    $this->User->create();
    $lvl = $this->data['User']['level'];
    $charids = $this->Kanji->find('list',array('conditions'=>array('grade <=' => $lvl,'grade >=' => 1)));
    $i = 0;
    foreach ($charids as $charid){
        $this->data['Kanji']['Kanji'][$i] = $charid;
        $i++;
    }
    if ($this->User->save($this->data)) {
        $this->Session->setFlash(__('The user has been saved', true));
        $this->redirect(array('action' => 'index'));
    } else {
        $this->Session->setFlash(__('The user could not be saved. Please, try again.', true));
    }
}

}

如何运作

  1. 您将当前级别保存为$lvl$this->data['User']['level'];
  2. 您发现所有Kanjis都在制定您的标准($charids = $this->Kanji->find('list',array('conditions'=>array('grade <=' => $lvl,'grade >=' => 1)));
  3. 您定义的新变量等于0($i = 0;
  4. 您在数据数组中进行循环,存储您找到的每个Kanjis并将其分配给$this->data['Kanji']['Kanji'],因为如果您在表单中选择了它,它将是默认数据。
  5. 您可以保存表单填充的数据。

答案 1 :(得分:0)

好的,我看错了两件事:D

1)你发现你的查找条件有误,你会得到12000多行:S和那个评论说我给你的错字

发现必须是这样的:

$test = $this->Kanji->find ('list',array(
      'conditions'=> array(
          'Kanji.grade <=' => $lvl,
          'AND' => array(
              'Kanji.grade >=' => 1)
           )
       )
);

2)保存中的数据错误:

cookbook解释说,传递的数据必须如下:

Array
(
    [ModelName] => Array
        (
            [fieldname1] => 'value'
            [fieldname2] => 'value'
        )
)

所以你的保存部分应该是这样的:

$this->KanjiUser->create();
$data = array(
         'KanjiUser' => array(
                 'KanjiUser.kanji_id'=>$charid,
                 'KanjiUser.user_id'=>$this->User->id,
                 'KanjiUser.level'=>2
          )
);
if ($this->KanjiUser->save($data))
   echo 'Done ;)';
else
   echo 'error';

所有这些都在foreach中,或者你可以做save​​All方法

$data = array('KanjiUsers'=> array());
foreach ($charids as $charid){
                $data ['KanjiUsers'][] = array(
                    'KanjiUser' => array(
                         'KanjiUser.kanji_id'=>$charid,
                         'KanjiUser.user_id'=>$this->User->id,
                         'KanjiUser.level'=>2
                     )
                );
}
$this->KanjiUser->create();

if ($this->KanjiUser->saveAll($data['KanjiUser'))
   echo 'Done ;)';
else
   echo 'error';