CakePHP 模型关联 HasMany - 保存错误

Posted

技术标签:

【中文标题】CakePHP 模型关联 HasMany - 保存错误【英文标题】:CakePHP Model Association HasMany - Save Error 【发布时间】:2012-10-17 22:46:11 【问题描述】:

我有一个名为 Game 的模型,它与 Planet 模型具有 hasMany 关系(而 Planet 模型又定义回 Game 模型的 belongsTo)。

在创建我的第一个游戏记录时,我使用它的starting_num_planets 字段的值来尝试创建那么多关联的行星记录。 GamesController 通过调用 PlanetsController 中的一个函数来实现这一点,每次调用该函数时,都会返回一个与 Planet 模型匹配的数组,并且应该是可保存的,这是 GamesController 尝试做的下一件事。

游戏记录创建得很好,但我在尝试访问第二个控制器的功能时遇到了一个无效的 SQL 语法错误显然。这很奇怪,因为我直到几行之后才尝试保存。

这是 GamesController 的代码:

public function newgame() 
        if ($this->request->is('post')) 
            $this->Game->create();
            if ($this->Game->save($this->request->data)) 
                // Add the 'id' element to the Game array and put the whole game record on the session
                $this->request->data['Game']['id'] = $this->Game->getLastInsertID();
                $this->Session->write('Game', $this->request->data);

                // Create the number of planet records indicated by start_num_planets
                $count = 0;
                $planets = array();
                while ($count < $this->request->data['Game']['starting_num_planets']) 
                    $planetData = $this->Game->Planet->generate_planet_data($this->request->data['Game']['id']);
                    $planets[$count] = $planetData;
                    $this->Game->Planet->create();
                    $this->Game->Planet->save($planetData);
                    $count++;
                

                $this->redirect(array('action' => 'main'));
             else 
              $this->Session->setFlash('There was a problem creating the game.');
            
        
    

在此行的行号处:

$planetData = $this->Game->Planet->generate_planet_data($this->request->data['Game']['id']);

我得到:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near 'generate_planet_data' at line 1

SQL Query: generate_planet_data

恐怕我也不知道为什么。

这是在 PlanetsController 中调用的函数:

public function generate_planet_data($gameId) 
    $planetNames = array(1 => 'name1', 2 => 'name2', 3 => 'name3', 4 => 'name4');
    $planetImages = array(1 => '01', 2 => '02', 3 => '03', 4 => '04');
    $planetData = array();
    // game_id is the foreign key, do I have to explicitly state that in the model?
    $planetData['Planet']['game_id'] = $gameId;
    $planetData['Planet']['planet_name'] = $planetNames[rand(1,10)];
    $planetData['Planet']['planet_image_file'] = $planetImages[rand(1,4)];
    return $planetData;

Game.php 中的模型关联很简单:

var $hasMany = array(
    'Planet' => array(
        'className' => 'Planet'),
    'Player' => array(
        'className' => 'Player'
    )
);

谁能告诉我出了什么问题?这是我第一次尝试使用关联模型,结果有点不对劲! :)

【问题讨论】:

函数 generate_planet_data 在哪里声明? 这在 PlanetsController 中。 (我刚刚读到它可能应该在 Planet 模型中,但我认为这不会解决我的问题,即使它是“更好”的 MVC 设计...... 看我的回答希望这会奏效 【参考方案1】:

问题是你在这里调用了一个缺失的函数:

$planetData = $this->Game->Planet->generate_planet_data($this->request->data['Game']['id']);

正如你所说,generate_planet_data 在控制器上。所以你应该这样称呼它:

$planetData = $this->generate_planet_data($this->request->data['Game']['id']);

如 cmets 所述,此逻辑可能属于 Planet 模型。如果你把它移到那里,你就可以通过你原来的方式访问它。

【讨论】:

值得注意的是,每当您看到SQL Query: some_function_name 错误,这是因为您在模型上调用了缺失的方法。 是的,这成功了,我现在在我的 Planet 模型中有了这个功能。因此,我现在也意识到了胖模型,瘦控制器的精神。感谢您的帮助。 将缺失的方法转换为 SQL 调用是我最不喜欢 Cake 的特性。 @BenGraham 是的,这很糟糕。由于findByX() 函数所需的魔法,它会引发该错误。

以上是关于CakePHP 模型关联 HasMany - 保存错误的主要内容,如果未能解决你的问题,请参考以下文章

CakePHP - 在模型中查找没有 hasMany 关系的 hasMany 关联?

CakePHP - 如何一次通过记录保存单个 hasMany,每个 hasMany 有多个 belongsTo 记录?

CakePHP- 保存相关模型数据

CakePHP:无法识别 hasMany 关联

CakePHP HABTM 关系保存新的关联

Cakephp - 条件保存