我有一个 n...n 结构,对两个表, makesmodels.迄今为止没有问题。

在第三个表(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 方法发出条件。

请参阅: http:/ /www.cricava.com/blogs/index.php?blog=6&title=modelizing_habtm_join_tables_in_cakephp_&more=1&c=1&tb=1&pb=1

其他提示

这是我的提示:在尝试使用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()

的结果中获取模型标题列表
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top