我有一个在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个递归,一个选择所有我认为不存在问题但是在与表的关系中..
答案 0 :(得分:1)
那不是多少/属于关系如何运作。
您当前的代码描述了以下关系:
ActiveIngredient
属于 IngredientAlias
IngredientAlias
有很多 ActiveIngredient
这是从IngredientAlias
到ActiveIngredient
的一对多关系。
但是您的数据库架构描述了以下表关系:
ActiveIngredient
属于 Ingredient
Ingredient
有很多 ActiveIngredient
IngredientAlias
属于 Ingredient
Ingredient
有很多 IngredientAlias
换句话说,从Ingredient
到ActiveIngredient
的一对多关系,以及另一个一对多关系Ingredient
至IngredientAlias
。
因此,您的模型关系应该与数据库模式描述的完全一致。 (此外,您的外键应该引用候选键.MySQL允许您创建不引用候选键的外键约束,但我不认为大多数其他数据库允许这样做;因此CakePHP可能也不会#39; t允许它。)
最后,CakePHP中的recursive
级别从-1
到2
(含)。 recursive
级别3
没有recursive
级。如果您只是将2
设置为findAll
,那么ActiveIngredient
上的Ingredient
将返回其父Ingredient
和该父IngredientAliases
'小孩recursive
。
recursive
使用了多个查询。但是,大多数情况下,它会从您不需要的模型中获取大量不必要的数据。最好的办法是使用unbindModel()
删除不需要的关联,或者在可能的情况下将-1
设置为{{1}}和use joins
获取相关数据。
第一个选项的另一个变体是使用the Containable behavior。这使您可以定义要返回的确切关系和字段。这通常是优化需要递归查询的查找的最简单方法。