0

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

成分别名:

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

活动成分

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

成分 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'            
        )
    );

当我在其中创建变量的 var_dump 时,IngredientAlias什么都没有,是空的,就像它不使用外键一样。为什么?问题出在关系上?我试着写

'foreignKey'   => 'ingredient_id'

但没什么..一样

该查询是一个带有 3 个递归的简单查询,我认为全选不是问题,而是与表的关系..

4

1 回答 1

1

hasMany/belongsTo 关系不是这样运作的。

您当前的代码描述了一种关系,其中:

  • ActiveIngredient 属于 IngredientAlias
  • IngredientAlias 有很多 ActiveIngredient

这是从到的一对多关系。IngredientAliasActiveIngredient

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

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

换句话说,一个从to的一对多关系,和另一个从to的一对多关系。IngredientActiveIngredientIngredientIngredientAlias

所以你的模型关系应该正是数据库模式所描述的。(此外,您的外键应该引用候选键。MySQL 允许您创建不引用候选键的外键约束,但我认为大多数其他数据库不允许这样做;因此 CakePHP 可能也不允许这样做.)

最后,recursiveCakePHP 中的级别范围从-12(含)。没有recursive水平3。如果您只是设置recursive2,则 a findAllonActiveIngredient将返回其父级Ingredient和该父Ingredient级的子级IngredientAliases


编辑:
recursive在后台使用多个查询。然而,大多数时候,它会从你不需要的模型中获取大量不必要的数据。最好的做法是使用unbindModel()删除不需要的关联,或者在可能的情况下设置recursive-1使用获取joins关联数据。

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

于 2012-07-22T10:53:10.843 回答