我怎么加入两个表格在第三n..n(hasandbelongstomany关联)的关系在Cake?
-
02-07-2019 - |
题
我有一个 n...n
结构,对两个表, makes
和 models
.迄今为止没有问题。
在第三个表(products
),如:
id
make_id
model_id
...
我的问题是创建一个图产品的一个特定的 make
在我的 ProductsController
只包含这就是做模型:
我以为这个可能的工作:
var $uses = array('Make', 'Model');
$this->Make->id = 5; // My Make
$this->Make->find(); // Returns only the make I want with it's Models (HABTM)
$this->Model->find('list'); // Returns ALL models
$this->Make->Model->find('list'); // Returns ALL models
所以,如果我想要使用 list
要传递给我看到创建无线电按钮我会做一个 foreach()
我 make
阵列,以找到所有模式的标题,并创建一个新的阵列,并发送至看过 $this->set()
.
$makeArray = $this->Make->find();
foreach ($makeArray['Model'] as $model) {
$modelList[] = $model['title'];
}
$this->set('models', $models)
是否有任何更容易的方式来得到那个列表中没有强调 make
阵列。这将是一个双方共同的任务,以发展这样的情况下在我的申请(s)。
预先感谢任何的暗示!
解决方案 5
可以通过在模型上的habtm数组中使用 with
操作来实现解决方案。
使用 with
,您可以定义“中间”和“中间”。表格如下:
$habtm = " ...
'with' => 'MakeModel',
... ";
在内部,在模型或控制器中,您可以向 find
方法发出条件。
其他提示
这是我的提示:在尝试使用Cake库重建之前,尝试使用常规SQL编写查询。从本质上讲,您正在做很多DB可以为您做的额外工作。 你的方法(仅用于展示 - 不是很好的SQL):
SELECT * FROM makes, models, products WHERE make_id = 5
你没有考虑这些关系(除非Cake自动神奇地理解表格之间的关系)
你可能正在寻找将这些东西结合在一起的东西:
SELECT models.title FROM models
INNER JOIN products
ON products.model_id = models.model_id
AND products.make_id = 5
希望这是朝着正确方向的推动?
从你的评论,什么,你要求是如何得到的结果从一定的模式,那里的条件是在HABTM相关的模型。I.e。东西,你会的通常做一个加入声明在原SQL。
目前的一些弱点的蛋糕。有不同的战略来处理这一问题。
具有相关模式B返回的所有标识的可能候选人的一个模型,然后做的第二个查询模型A即:
$this->ModelB->find('first', array('conditions' => array('field' => $condition))); array( ['ModelB'] => array( ... ), ['ModelA'] => array( [0] => array( 'id' => 1 ) )
现在你有一系列的所有id的ModelA属于ModelB相匹配的条件下,它可以方便地提取使用设定::extract().基本上相当于
SELECT model_a.id FROM model_b JOIN model_a WHERE model_b.field = xxx
.接下来你看ModelA:$this->ModelA->find('all', array('conditions' => array('id' => $model_a_ids)));
即将产生
SELECT model_a.* FROM model_a WHERE id IN (1, 2, 3)
, ,这是一种迂回的方式这样做的参加发言。如果你需要的条件,在多个相关的模式,重复,直到你有所有的id ModelA,SQL将使用的交的所有id(WHERE id IN (1, 2, 3) AND id IN (3, 4, 5)
).如果你只需要一个条件ModelB但要检索ModelA,只要搜索ModelB.蛋糕会自动检索相关的ModelAs为您(见上文)。你可能需要设置::extract()再次,但是可能已经足够。
你可以使用上述方法和结合 可以包含的行为 获得更多的控制权的结果。
如果一切都失败或上述方法只是产生过多的开销,你仍然可以写你自己的原SQL
$this->Model->query()
.如果你坚持的蛋糕SQL标准(名表正确FROM model_as AS ModelA
)蛋糕仍将后处理结果是正确的。
希望这个送你在正确的方向。
所有不同的Make-> find()和Model-> find()调用完全相互独立。即使Make-> Model-> find()与Model-> find()相同,Cake也不会记住或考虑到您在其他模型中已经找到的内容。您正在寻找的是:
$this->Product->find('all', array('conditions' => array('make_id' => 5)));
查看Set :: extract()方法,从$ this-> Make-> find()
的结果中获取模型标题列表