cakephp关系模型

时间:2012-07-22 10:20:51

标签: sql cakephp cakephp-appmodel

我有一个在CakePHP 2.0中开发的网站。 我有一个包含许多表的数据库,我想关联两个表。我已经做了很多次,但有两张桌子,我不能这样做,我不知道为什么。 这是我的两张桌子:

ingredient_aliases:

id             INT(10) UNSIGNED AUTO_INCREMENT 
ingredient_id  INT(10)          
user_id        INT(10)          
alias          VARCHAR(100) latin1_swedish_ci 

acitivity_ingredients

id             INT(10) UNSIGNED     
activity_id    INT(11)      
ingredient_id  INT(10)          
created        DATETIME

ingredient_id是我的外键,这是我的模型,我想把ingredient_id作为我的外键。

class ActivityIngredients extends AppModel{
        public $name = 'ActivityIngredients'; 
        public $useTable = 'activity_ingredients';

        public $belongsTo = array(
            'IngredientAlias' => array(
                'className'     => 'IngredientAlias',
                'conditions'    => '',
                'order'         => '',
                'foreignKey'    => 'ingredient_id'
            )
        );


    }

class IngredientAlias extends AppModel {
    public $name = 'IngredientAlias';
    public $useTable = 'ingredient_aliases';
    public $belongsTo = array(
        'Ingredient' => array(
            'className'    => 'Ingredient',
            'foreignKey'   => 'ingredient_id'
        ),
         'User' => array(
            'className'    => 'User',
            'foreignKey'   => 'user_id'
        )
    );

    public $hasMany = array (
        'ActivityIngredients' => array (
            'className'     => 'ActivityIngredients',
            'dependent' => true,
            'foreignKey'   => false,
            'associatedKey'   => 'ingredient_id'            
        )
    );

当我在IngredientAlias中创建变量的var_dump时,没有任何东西,是空的,就像它没有取出外键一样。为什么? 问题在于关系? 我试着写

'foreignKey'   => 'ingredient_id'

但没有......同样的

查询是一个简单的查询,有3个递归,一个选择所有我认为不存在问题但是在与表的关系中..

1 个答案:

答案 0 :(得分:1)

那不是多少/属于关系如何运作。

您当前的代码描述了以下关系:

  • ActiveIngredient 属于 IngredientAlias
  • IngredientAlias 有很多 ActiveIngredient

这是从IngredientAliasActiveIngredient一对多关系。

但是您的数据库架构描述了以下表关系:

  • ActiveIngredient 属于 Ingredient
  • Ingredient 有很多 ActiveIngredient
  • IngredientAlias 属于 Ingredient
  • Ingredient 有很多 IngredientAlias

换句话说,从IngredientActiveIngredient一对多关系,以及另一个一对多关系IngredientIngredientAlias

因此,您的模型关系应该与数据库模式描述的完全一致。 (此外,您的外键应该引用候选键.MySQL允许您创建不引用候选键的外键约束,但我不认为大多数其他数据库允许这样做;因此CakePHP可能也不会#39; t允许它。)

最后,CakePHP中的recursive级别从-12(含)。 recursive级别3没有recursive级。如果您只是将2设置为findAll,那么ActiveIngredient上的Ingredient将返回其父Ingredient和该父IngredientAliases'小孩recursive

<小时/> 修改
recursive使用了多个查询。但是,大多数情况下,它会从您不需要的模型中获取大量不必要的数据。最好的办法是使用unbindModel()删除不需要的关联,或者在可能的情况下将-1设置为{{1}}和use joins获取相关数据。

第一个选项的另一个变体是使用the Containable behavior。这使您可以定义要返回的确切关系和字段。这通常是优化需要递归查询的查找的最简单方法。