Cake PHP 3.4 - 如何在同一个查询中添加 2 个内连接?

Cake PHP 3.4 - how to add 2 inner joins on the same query?

蛋糕 PHP 3.4 运行宁在 MAMP 上。我有以下情况:

SQLtables

TABLE `Ingredients` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `category_id` int(11) NOT NULL,
  `measure_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


Table products
TABLE `Products` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL,
  `retail_price` float NOT NULL,
  `best_before` int(11) NOT NULL,
  `comments` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;



TABLE `ingredients_products` (
  `ingredient_id` int(11) NOT NULL,
  `product_id` int(11) NOT NULL,
  `qty` double NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Table 型号:

class IngredientsTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('ingredients');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->hasMany('Purchases', [
            'foreignKey' => 'ingredient_id'
        ]);
        $this->hasMany('IngredientsProducts', [
            'foreignKey' => 'ingredient_id'
        ]);
    }

class ProductsTable extends Table
{

    public function initialize(array $config)
    {
        parent::initialize($config);

        $this->setTable('products');
        $this->setDisplayField('name');
        $this->setPrimaryKey('id');

        $this->hasMany('IngredientsProducts', [
            'foreignKey' => 'product_id'
        ]);
    }

在 CakePHP 上,我按照食谱的书签教程(根据我的情况改编)进行了操作。其逻辑是拥有一种包含多种成分的产品。这似乎在烘烤后工作正常。

我想要实现的是:在特定产品的产品视图上,我想显示产品字段(与产品的 id 相关),还有成分。 使用我的代码,我正在显示产品字段(没问题),但仅显示加入者的相关 ID table ingredients_products.

public function view($id = null)
    {
        $product = $this->Products->get($id, [
            'contain' => ['IngredientsProducts']
        ]);

        $this->set('product', $product);
        $this->set('_serialize', ['product']);



    }

在 SQL 中,我 运行 的查询是:

SELECT products.name as prod, ingredients.name as ingr, ingredients_products.qty as qty 
FROM ingredients_products
    INNER JOIN products
        ON ingredients_products.product_id = products.id
    INNER JOIN ingredients 
        ON ingredients_products.ingredient_id = Ingredients.id

我一直在尝试在查询构建器页面上找到的东西:https://book.cakephp.org/3.0/en/orm/query-builder.html

但我找不到任何可以让我进行此类查询的内容。 有谁知道如何实现?

谢谢!

我不确定我是否完全遵循您想要实现的目标,但如果您只想要特定产品的所有成分,您可以 contain 产品的 Ingredients 如下所示: -

$product = $this->Products->get($id, [
    'contain' => ['Ingredients']
]);

但是,如果您想实现问题中描述的 SQL 查询,那么您可以为连接定义模型 table,然后对其进行查询。所以你会有一个 IngredientsProductsTable 模型:-

class IngredientsProductsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsTo('Ingredients');
        $this->belongsTo('Products');
    }
}

然后在你的控制器中:-

$this->loadModel('IngredientsProducts');
$data = $this->IngredientsProducts->find('all')
    ->contain(['Ingredients', 'Products']);

这听起来很像属于并且有很多关系。

class IngredientsTable extends Table
{
    public function initialize(array $config)
    {
        // Use through option because it looks like you 
        // have additional data on your IngredientsProducts table
        $this->belongsToMany('Products', [
            'through' => 'IngredientsProducts',
        ]);
    }
}

class ProductsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsToMany('Ingredients', [
            'through' => 'IngredientsProducts',
        ]);
    }
 }

class IngredientsProductsTable extends Table
{
    public function initialize(array $config)
    {
        $this->belongsTo('Ingredients');
        $this->belongsTo('Products');
    }
}