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');
}
}
蛋糕 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');
}
}