将数据保存到另一个模型 cakePHP 3.5

2024-03-21

我还是 cakephp 的初学者。我有表格问题和问题测验。我在问题控制器中创建了名为existingQuestion 的表单,并希望将其保存在表questionQuizzes 中。但是,该表格无法保存。我已经关注了这个example https://stackoverflow.com/questions/37707646/cakephp-3-saving-to-an-different-table但仍然无法保存。

这是问题控制器

public function existingQuestion()
{  

    //echo "here<br><br>";
    //$QuestionQuizzesTable = 
    $this->loadModel('QuestionQuizzes');
    $questions = $this->paginate($this->Questions);
    $questionQuiz = $this->QuestionQuizzes->newEntity();

    //print_r($this->request->getData());
    //die();

    if($this->request->is('post'))
    {

        $questionQuiz = $this->QuestionQuizzes->patchEntity($questionQuiz, $this->request->getData());
        print_r($this->request->getData());
        die();

        if ($this->QuestionQuizzes->save($questionQuiz)) {
            $this->Flash->success(__('The question has been saved.'));

            return $this->redirect(['action' => 'existingQuestion']);
        }
        $this->Flash->error(__('The question could not be saved. Please, try again.'));
    }

    //$this->Questions->saveAll($this->request->getData());
    $this->set(compact('questions'));
    $this->set('_serialize', ['questions']);
}

有人可以帮助我吗?

编辑3: 这是我的existing_questions.ctp

<?php

 /**
 * @var \App\View\AppView $this
 * @var \App\Model\Entity\Question[]|\Cake\Collection\CollectionInterface 
  $questions
  */
  use Cake\ORM\TableRegistry;
  ?>
  <nav class="large-3 medium-4 columns" id="actions-sidebar">
   <ul class="side-nav">
    <li class="heading"><?= __('Actions') ?></li>
    <li><?= $this->Html->link(__('Courses'), ['controller' => 'Courses',  
    'action' => 'index']) ?></li>
    </ul>
    </nav>
   </nav>
    <div class="questions form large-9 medium-8 columns content">
    <fieldset>
    <legend><?= __('Add Question') ?></legend>
    <?php echo $this->Form->create($questionQuiz) ?>  
    <table cellpadding="0" cellspacing="0">
    <thead>
        <tr>
            <th scope="col"><?= $this->Paginator->sort('checked') ?></th>
            <th scope="col"><?= $this->Paginator->sort('id') ?></th>
            <th scope="col"><?= $this->Paginator->sort('question') ?></th>
            <th scope="col"><?= $this->Paginator->sort('marks') ?></th>
        </tr>
    </thead>
    <tbody>
        <?php foreach ($questions as $question): ?>
        <tr>
            <td><?= $this->Form->checkbox('questions[].', ['value' => 
            $question['id'], 'name' => 'question[id][]', 'checked'=>false, 
                'hiddenField' => false])?></td>
               <td><?= $this->Number->format($question->id) ?></td>
                <td><?= h($question->question) ?></td>
                <td><?= $this->Number->format($question->marks) ?></td>
        </tr>
        <?php endforeach; ?>                 
    </tbody>
    </table>
    <input type="submit" value="Save">        
    </form>
    <div class="paginator">
    <ul class="pagination">
        <?= $this->Paginator->first('<< ' . __('first')) ?>
        <?= $this->Paginator->prev('< ' . __('previous')) ?>
        <?= $this->Paginator->numbers() ?>
        <?= $this->Paginator->next(__('next') . ' >') ?>
        <?= $this->Paginator->last(__('last') . ' >>') ?>
    </ul>
    <p><?= $this->Paginator->counter(['format' => __('Page {{page}} of {{pages}}, showing {{current}} record(s) out of {{count}} total')]) ?></p>
     <?php //$this->Form->button(__('Submit'), ['action' => 'existingQuestion'])
         $this->Form->submit('Save'); 
        // $this->Form->end() ?>
</div>
</fieldset>
</div>

编辑4: 我有包含 id 和测验 id 的表测验。我有表 questions 包含 id、问题 id、问题和分数。然后,我有表 QuestionQuizzes,其中包含测验 id 和问题 id。

这是 quizzesTable.php 模型:

class QuizzesTable extends Table
{

/**
 * Initialize method
 *
 * @param array $config The configuration for the Table.
 * @return void
 */
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('quizzes');
    $this->setDisplayField('title');
    $this->setPrimaryKey('id');

    $this->belongsTo('Courses', [
        'foreignKey' => 'course_id',
        'joinType' => 'INNER'
    ]);
    $this->hasMany('Attempts', [
        'foreignKey' => 'quiz_id'
    ]);
    $this->hasMany('Gradebooks', [
        'foreignKey' => 'quiz_id'
    ]);
}

/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->integer('id')
        ->allowEmpty('id', 'create');

    $validator
        ->scalar('title')
        ->requirePresence('title', 'create')
        ->notEmpty('title');

    return $validator;
}

/**
 * Returns a rules checker object that will be used for validating
 * application integrity.
 *
 * @param \Cake\ORM\RulesChecker $rules The rules object to be modified.
 * @return \Cake\ORM\RulesChecker
 */
public function buildRules(RulesChecker $rules)
{
    $rules->add($rules->existsIn(['course_id'], 'Courses'));

    return $rules;
}
}

这是 questionsTable.php

class QuestionsTable extends Table
{

/**
 * Initialize method
 *
 * @param array $config The configuration for the Table.
 * @return void
 */
public function initialize(array $config)
{
    parent::initialize($config);

    $this->setTable('questions');
    $this->setDisplayField('id');
    $this->setPrimaryKey('id');

    $this->hasMany('QuestionQuizzes', [
        'foreignKey' => 'question_id'
    ]);
}

/**
 * Default validation rules.
 *
 * @param \Cake\Validation\Validator $validator Validator instance.
 * @return \Cake\Validation\Validator
 */
public function validationDefault(Validator $validator)
{
    $validator
        ->integer('id')
        ->allowEmpty('id', 'create');

    $validator
        ->scalar('question')
        ->requirePresence('question', 'create')
        ->notEmpty('question');

    $validator
        ->numeric('marks')
        ->requirePresence('marks', 'create')
        ->notEmpty('marks');

    return $validator;
}
}

编辑: 存在函数:

public function existQues()
{
    $questions = TableRegistry::get('questions');
    $query = $questions->find();

    foreach ($query as $row) 
    {
        $quizzes = $this->paginate($this->Quizzes);

        $this->set(compact('quizzes'));
        $this->set('_serialize', ['quizzes']);
    }
}

您的数据格式错误。你在哪里找到这个的?它应该看起来像这样:

[
    'questions' => [
        '_ids' => [
            0 => 60,
            1 => 61,
        ]
    ]
]

请注意,问题现在采用小写和复数形式,并且 id 替换为 _ids。看here https://book.cakephp.org/3.0/en/orm/saving-data.html#converting-belongstomany-data更多细节。

您还需要将其移至测验控制器(正如我建议的那样)上次 https://stackoverflow.com/questions/47581458/merge-index-and-add-action-into-form-in-cakephp-3-5)并做patchEntity在测验实体上(通过测验模型),因为现在您拥有的数据毫无意义:它如何知道应该将这些问题添加到哪个测验?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将数据保存到另一个模型 cakePHP 3.5 的相关文章

随机推荐