特殊的cakephp模型关系

时间:2010-10-16 11:15:57

标签: cakephp models

我正在制作我的第一个CakePHP项目(除了我所做的所有教程......)。

我正在为田径运动的训练员和运动员建立一个网站。

现在在我的数据库中我有一个用户表,其中包含字段:id,username,firstname,lastname,email,password,...

然后我还有两个带有字段的表:

训练者:id,type_id(冲刺,距离,投掷......),user_id

运动员:id,type_id(冲刺,距离,投掷......),user_id,trainer_id

我的训练师模型看起来像这样

<?php
class Trainer extends AppModel {
    var $name = 'Trainer';
    var $hasOne = array('User');
    var $hasMany = array(
        'Schema'=>array(
            'className'=>'Schema',
            'foreighnKey'=>'trainer_id'
        ),
        'Athlete'=>array(
            'className'=>'Athlete',
            'foreighnKey'=>'trainer_id'
        )
    );
}
?>

我的运动员模型看起来像这样

<?php
class Athlete extends AppModel {
    var $name = 'Athlete';
    var $hasOne = array('User');
    var $belongsTo = array(
        'Trainer'=>array(
            'className'=>'Trainer',
            'foreighnKey'=>'trainer_id'
        ),
        'Schema'=>array(
            'className'=>'Schema',
            'foreighnKey'=>'schema_id'
        )
    );
}
?>

我的用户模型目前是这样的

<?php
class User extends AppModel {
    var $name = 'User'; 
    var $belongsTo = array('Usertype');
}
?>

但这显然应该改变,因为当我去域/ app / trainers或域/ app /运动员时,我得到错误:

Warning (512): SQL Error: 1054: Unknown column 'User.trainer_id' or 'User.athlete_id' in 'on clause' [CORE/cake/libs/model/datasources/dbo_source.php, line 681]

如此短暂的再现:用户是训练师或运动员,我有一张用户桌,一张运动员桌和一张训练台。

运动员有一名训练师和一名训练师,训练师有很多运动员和许多计划......

问题出在于用户是训练师的运动员......,我需要在模型中加入什么才能使其发挥作用?我希望我说得足够清楚:s

2 个答案:

答案 0 :(得分:0)

您必须在$hasOne模型中定义User关联,因为您的athletestrainers表包含外键。另请参阅http://book.cakephp.org/view/1039/Associations-Linking-Models-Together#hasOne-1041

答案 1 :(得分:0)

我不明白你在模型中对'schema'的使用。我认为你的外键是错的。所以我要说以下内容:

<?php

// /models/trainer.php
class Trainer extends AppModel {
    var $name = 'Trainer';
    var $hasOne = array('User');
    var $hasMany = array(
        'Athlete'=>array(
            'className'=>'Athlete',
            'foreignKey'=>'user_id'
        )
    );
}

// /models/trainer.php
class Athlete extends AppModel {
    var $name = 'Athlete';
    var $hasOne = array('User');
    var $belongsTo = array(
        'Trainer'=>array(
            'className'=>'Trainer',
            'foreignKey'=>'user_id'
        )
    );
}
?>

让用户运动员或训练师的问题是另一个问题。但我不认为你必须在你的模型中强制执行它。只需在您的用户表中设置一个字段type设置为“运动员”或“培训师”,您就可以了。