Как загрузить связанные модели и сохранить связанные данные в CakePHP? - PullRequest
1 голос
/ 07 декабря 2011

Я настраиваю систему пользователя / группы, которая позволяет пользователям отправлять запросы на присоединение к группе.

Кажется, я не могу загрузить связанную модель и добавить строку.На самом деле очень трудно устоять перед желанием просто использовать $ this-> query () и покончить с этим ... но я пытаюсь выучить соглашения Cake и делать все правильно.

В функции модели моей группы для обработки запросов на групповое присоединение:

$this->loadModel('GroupRequest');
$this->data = array('GroupRequest' => 
array('user_id' => $uid, 'group_id' => $gid));

if($this->GroupRequest->save($this->data)){ echo 'save success'; } 
else { echo 'save fail'; }

Вот ошибки, которые я получаю, когда запускаю это:

Предупреждение (512): Ошибка SQL: 1064:У вас есть ошибка в вашем синтаксисе SQL;проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с 'loadModel' в строке 1 [CORE / cake / libs / model / datasources / dbo_source.php, строка 684] Запрос: loadModel

Примечание (8): неопределенное свойство: Group :: $ GroupRequest [APP / models / group.php, строка 124] Неустранимая ошибка: вызов функции-члена save () для необъекта в / home / wxworksmat / sspot3 / app/models/group.php в строке 124

Я также пытался использовать App :: import:

App::import('Model','GroupRequest');

Я не получаю никаких ошибок SQL при импорте модели таким образом,но это все еще не работает.Я получаю следующую ошибку при вызове save () или create ():

Неустранимая ошибка: вызов функции-члена save () для необъекта в / home / wxworksmat / sspot3 / app/models/group.php в строке 124

Ответы [ 4 ]

1 голос
/ 07 декабря 2011

Я могу ошибаться, и, пожалуйста, извините, если я ошибаюсь, но похоже, что вы не очень хорошо понимаете концепцию фреймворка.Трудно ответить на ваш вопрос, не дав вам полного урока.

При этом все зависит от ассоциаций моделей.Если все сделано правильно, все становится проще.Вы должны прочитать:

Связи: связывание моделей вместе

После того как ваши модели будут правильно связаны, вы сможете сохранить основную модель, а также связанныемодель, очень легко.

Сохранение данных связанной модели (hasOne, hasMany, ownTo)

1 голос
/ 07 декабря 2011

Как я понимаю, вы пытаетесь сделать это изнутри модели?

class GroupRequest extends AppModel {

    public function associate($user, $group) {
        $data["GroupRequest"] = array("user_id" => $user, "group_id" => $group);
        $this->save($data);
    }

}

Затем в вашем контроллере (предполагается, что group_requests_controller)

$this->GroupRequest->associate($user, $group);

Если вы вызываете этос другого контроллера вы сначала загрузите модель

$this->loadModel("GroupRequests");
$this->GroupRequest->associate($user, $group);

Однако, если вы делаете все это из контроллера GroupRequests, вы сможете сохранить его напрямую, не делая для него отдельный метод

public function add() {
    $this->GroupRequest->create();
    $this->GroupRequest->save($this->data); #for < 2.0
}

Ваш взгляд должен выглядеть примерно так:

<?php
    echo $this->Form->create("GroupRequest");
    echo $this->Form->input("user_id");
    echo $this->Form->input("group_id");
    echo $this->Form->end("Submit");
?>
1 голос
/ 07 декабря 2011

Вы путаете методы контроллера и модели

$this->loadModel()

является методом контроллера и может использоваться только там. Вы всегда должны использовать

$this->ModelName = ClassRegistry::init('ModelName');

везде

0 голосов
/ 07 декабря 2011

Проблема, с которой я столкнулся, заключалась в том, что у меня не было правильных объявлений ассоциации моделей в верхней части моей модели.

Теперь у меня есть:

group.php

var $hasMany = 'GroupRequest';

group_request.php

var $belongsTo = array(
    'User' => array(
        'className' => 'User',
        'foreignKey' => 'user_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    ),
    'Group' => array(
        'className' => 'Group',
        'foreignKey' => 'group_id',
        'conditions' => '',
        'fields' => '',
        'order' => ''
    )
);
public function new_request($user, $group) {
    $data["GroupRequest"] = array("user_id" => $user, "group_id" => $group, 'status' => 'pending');

    if($this->save($data)){ return true;} else {return false;}
}

Теперь, когда все настроено ПРАВИЛЬНО ... Я могу сделать это в моей модели group.php:

$this->GroupRequest->new_request($uid,$gid)

В качестве дополнительного бонуса, поскольку связи правильно заполняются, когда я делаю $ this-> find в моей группе или модели пользователя, теперь отображаются все связанные записи GroupRequest. Бонусные данные FTW.

...