Thursday, March 17, 2022

[FIXED] Controller doesn't get hasOne relationship data - Cakephp

Issue

I have a problem with related tables in CakePHP. I can't get the related table data include in the form.

I have two Entities. One of them is "Users" and the other one is "Subjects". Every User has a subject. Table "Subject" has foreign key idUser from Users table.

I added in UsersTable:

$this->hasOne('Subjects');

And I added in SubjectsTable:

$this->belongsTo('Users', [
            'foreignKey' => 'idUser',
            'joinType' => 'INNER'
        ]);

In the view (signup), I have this:

<div class="form-group">
          <?php echo $this->Form->control('Subject.name',['label' => 'Asignatura','placeholder' => 'Ingrese asignatura','class' => 'form-control']) ?>
        </div>

In the controller, I have this:

$user = $this->Users->patchEntity($user, $this->request->getData(),['associated' => 'Subjects']);

When I debug $user, I am getting this result:

 \src\Controller\UsersController.php (line 113)

object(App\Model\Entity\User) {

    'id' => '11111111',
    'name' => 'Leo',
    'firstlastname' => 'Messi',
    'secondlastname' => 'Cuccittini',
    'email' => 'leo.messi@gmail.com',
    'password' => '$2y$10$E02nd/w89BDvgCyz36bQdeBbujOLrSdON1e6CD25aDYCP2VeLkNNm',
    'role' => '2',
    '[new]' => true,
    '[accessible]' => [
        'id' => true,
        'name' => true,
        'firstlastname' => true,
        'secondlastname' => true,
        'email' => true,
        'password' => true,
        'role' => true
    ],
    '[dirty]' => [
        'id' => true,
        'name' => true,
        'firstlastname' => true,
        'secondlastname' => true,
        'email' => true,
        'password' => true,
        'role' => true
    ],
    '[original]' => [],
    '[virtual]' => [],
    '[hasErrors]' => false,
    '[errors]' => [],
    '[invalid]' => [],
    '[repository]' => 'Users'

}

So, I am not getting in the controller the data from Subject.

Any help, please.


Solution

Model

$this->hasOne('Subjects', [
    'foreignKey' => 'userId'
]);

Controller:

$user = $this->User->get($id, ['contain' => ['Subjects']);

Entity/User.php

protected $_accessible = [

   'subjects' => true
   // ...

];

Form

https://book.cakephp.org/3.0/en/views/helpers/form.html#associated-form-inputs

Change: Subject.name to user.subject.name

<?php echo $this->Form->control('user.subject.name',['label' => 'Asignatura','placeholder' => 'Ingrese asignatura','class' => 'form-control']) ?>


Answered By - Salines

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.