CakePHP 3:belongsToMany(通过)和其他关联

时间:2017-07-18 22:14:34

标签: php cakephp cakephp-3.x

我定义了以下关联:

class RecipesTable extends Table
{
  $this->belongsToMany('Ingredients', [
    'through' => 'RecipesIngredients',
    'foreignKey' => 'recipe_id',
    'targetForeignKey' => 'ingredient_id',
  ]);

class IngredientsTable extends Table
{
  $this->belongsToMany('Recipes', [
    'through' => 'RecipesIngredients',
    'foreignKey' => 'ingredient_id',
    'targetForeignKey' => 'recipe_id',
  ]);

class RecipesIngredientsTable extends Table
{
  $this->belongsTo('Recipes');
  $this->belongsTo('Ingredients');
  $this->belongsTo('Units');

表'RecipesIngredients'具有以下结构:

id | recipe_id | ingredient_id | unit_id | ...

现在我提出类似下面的请求来获取食谱和相关成分。但没有单位。

$data = $this->Recipe->find('all')
    ->where('Recipe.id' => 55)
    ->contain(['Ingredient', ...])
    ->all();

我的问题是:如何在$this->Recipe的通话中获取相关“单元”的数据?

我尝试了不同的包含->contain(['Ingredient' => ['Unit'], ...])(等等),但这不起作用。 CakePHP只返回关联的ingredients和'through'连接表的内容,而不链接到关联的units。或者给出错过关联的错误。

1 个答案:

答案 0 :(得分:2)

使用contain()无法工作,至少不能使用belongsToMany关联,因为正在为连接表创建的中间关联创建得太迟了渴望装载机识别它。

您可以做的是手动为联接表明确创建其他动态生成的hasMany关联,例如在RecipesTable类添加:

$this->hasMany('RecipesIngredients', [
    'foreignKey' => 'recipe_id'
]);

然后你可以包含你的关联:

->contain(['RecipesIngredients' => ['Ingredients', 'Units']])