Модель CakePHP «Член» не связана с моделью «Член»

#php #cakephp

#php #cakephp

Вопрос:

Я создаю PHP-форум с помощью CakePHP, у меня проблемы с получением массива всех членов, а затем повторением их в представлении, вот мой код.

 <?php
App::uses('AppModel', 'Model');

class Member extends AppModel {

    public $validate = array(
        'username' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty')
            ),
        ),
        'password' => array(
            'notEmpty' => array(
                'rule' => array('notEmpty')
            ),
        ),
        'email' => array(
            'email' => array(
                'rule' => array('email')
            ),
        ),
    );

    public $hasMany = array(
        'Post' => array(
            'className' => 'Post',
            'foreignKey' => 'user_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        ),
        'Topic' => array(
            'className' => 'Topic',
            'foreignKey' => 'user_id',
            'dependent' => false,
            'conditions' => '',
            'fields' => '',
            'order' => '',
            'limit' => '',
            'offset' => '',
            'exclusive' => '',
            'finderQuery' => '',
            'counterQuery' => ''
        )
    );
}
  

Это моя модель члена, вот мой MembersController

 <?php
App::uses('Controller', 'AppController');

class MembersController extends AppController {

    public $components = array('Paginator');

    public function beforeFilter() {
        parent::beforeFilter();
        $this->Auth->allow('profile','login');
    }

    public function index(){
        $this->Paginator->settings['contain'] = array('Member');
        $this->set('members', $this->Paginator->paginate());
    }

    public function profile($id=null) {}

    public function login() {
        if($this->request->is('post')) {
            if ($this->Auth->login()) {
                $this->redirect($this->Auth->redirect());
            } else {
                $this->Session->setFlash(__('Invalid username or password'));
            }
        }
    }

    public function logout() {
        $this->redirect($this->Auth->logout());
    }
}
  

И вот мое представление индекса

 <div class="row">
    <?php foreach ($members as $member): ?>
        <?php echo $user[name]; ?>
    <?php endforeach; ?>
</div>
  

Когда я обращаюсь example.com/members Я получаю сообщение об ошибке, в котором говорится, что модель «Член» не связана с моделью «Член» [CORE/Cake/Model/Behavior/ContainableBehavior.php , строка 342]

Прежде чем вы спросите, я сделал AppModels actas доступными

 class AppModel extends Model {
    public $actsAs = array('Containable');
}
  

Комментарии:

1. С большой помощью burzum я исправил это, и я также обнаружил, что не имеет значения, как вы называете контроллер, вы можете использовать любые модели, которые вам нравятся, если вы добавляете public $uses = array(‘Model1’, ‘Model2’, ‘Model3’); в концеверхняя часть контроллера

2. Вместо того, чтобы загружать множество моделей в контроллер (даже если они загружены лениво), лучше получить доступ к другим моделям через ассоциации основной модели этого контроллера.

Ответ №1:

Удалите эту строку:

 $this->Paginator->settings['contain'] = array('Member');
  

Используя это, вы вызываете самосоединение, и вы не определили это в своей модели членов, и вы этого не хотите.

Это также неверно, плюс в вашем php есть синтаксическая ошибка «отсутствует» вокруг имени.

 <?php foreach ($members as $member): ?>
        <?php echo $user[name]; ?>
    <?php endforeach; ?>
  

Это должно быть:

 <?php foreach ($members as $member): ?>
        <?php echo $member['Member']['name']; ?>
    <?php endforeach; ?>
  

Вы боретесь с самыми основами, я бы порекомендовал вам прочитать руководство по блогу или, по крайней мере, прочитать о том, как данные передаются в представление и как работают ассоциации моделей. Вы можете найти все в книге.

Комментарии:

1. Спасибо. Я новичок в MVC и il, обязательно проверьте эти ссылки.

Ответ №2:

Ваша проблема здесь:

 public function index(){
    $this->Paginator->settings['contain'] = array('Member');
    $this->set('members', $this->Paginator->paginate());
}
  

Поскольку paginate вызывается из контроллера members, он по умолчанию попытается разбить Member на страницы. Ваш параметр contain указывает, что данные участника также должны содержать связанную модель, также с именем Member . У вас нет связи между членом и самим собой, отсюда и ошибка. Я собираюсь предположить, что параметр contain был ошибкой, поэтому просто удалите строку $this->Paginator->settings['contain'] = array('Member');

Ответ №3:

$this->Paginator->settings['contain'] = array('Member'); это ваша проблема. Поскольку настройки будут передаваться как параметры для вызова функции find() для Member модели, которую вы фактически просите Member содержать. Установите 'contain' array() значение, чтобы предотвратить выборку любых связанных записей.

Хотя рекомендуемый способ установить для свойства $recursive значение -1 in AppModel , чтобы по умолчанию не извлекались связанные записи. Затем Containable используется для извлечения связанных записей по мере необходимости.