CakePHP在hasMany上的命名约定(The Join Model)

时间:2014-02-03 09:42:50

标签: cakephp naming-conventions has-many-through

在经历了几周的这种不便之后,我决定在这里打开现在的主题。一个可以帮助我的主题,但我相信它也可以帮助其他人解决同样的问题!

我想知道如何命名hasMany through table(因此带有附加字段)的表,控制器和模型以及它的耦合表。我试图坚持使用CakePHP命名约定,如其食谱中所述,但这不断给我一些“找不到对象”的错误。出于实际原因,我会用多字命名表向您展示我的问题。也许这可能是问题的原因? ;)

场合

我有一个主题公园的粉丝,就像你现在一样,主题公园有很多景点。要乘坐景点,您必须拥有最小的高度。有时,小人只能与成年伴侣一起骑车。但大多数时候:你被允许乘坐景点,因为你的身高足够高;)

现在我想在我的网站上显示特定景点的信息。名称,内容,照片等。除了这些信息之外,我想展示我的客人,如果他们(或他们的孩子)足够高,可以乘坐这个景点。它应该是这样的:

0m00 -> 1m00: not allowed
1m00 -> 1m30: allowed with an adult companion
1m30 -> 1m90: allowed

数据库

我有两个代表两个对象的表:“吸引力”和“attraction_accessibilities”。在这种情况下,我100%确定数据库名称是否正确。

表“attraction_accessibilities”(id - name):

1 - Not allowed
2 - Allowed with an adult companion
3 - Allowed

表“吸引力”(id - name):

1 - Boomerang
2 - Huracan
3 - Los Piratas
4 - El Volador
...

其次,我应该在“吸引力”和“吸引力 - 可接受性”之间设置另一个表格。该表应包含:

  • 特定于每条记录的ID
  • 指向“景点”表(attraction_id)的ID的链接
  • 指向“attraction_accessibilities”表的ID的链接 (attraction_accessibility_id)
  • “min-height”和“max-height”
  • 等附加信息

我想我应该将该表命名为“attraction_accessibilities_attractions”。这是另外两个表的缩写,我这样做是因为CakePHP在您建立HABTM关联时提出了它(http://book.cakephp.org/2.0/en/models/associations-linking-models-together.html#hasandbelongstomany-habtm)。

但不幸的是,当我这样称呼它时,我从未成功地将我的应用程序中的这些模型链接在一起。

问题

是否有人遇到过相同的问题但找到了解决方法?如果“是”:我应该如何命名我的数据库表并且也很重要:我应该如何命名我的控制器和模型.php文件?

非常感谢能够帮助我和其他一些无望的程序员的人;)

1 个答案:

答案 0 :(得分:0)

如果您使用HABTM关系与唯一设置keepExisting,那么您可以根据需要命名表格,并根据您选择的名称设置joinTable参数

即。在你的景点模型

public $hasAndBelongsToMany = array(
    'AttractionAccessibility' =>
        array(
            'joinTable' => 'attraction_accessibilities_attractions',
        )
);

相反,如果您要使用hasMany through关系,则可以根据需要为表命名。事实上,所谓的“hasMany through”只是两个hasMany关系的连接

如此。如果您为表格限制命名,那么

class Attraction extends AppModel {
    public $hasMany = array(
        'Restriction'
    );
}


class AttractionAccessibility extends AppModel {
    public $hasMany = array(
        'Restriction'
    );
}



class Restrictionextends AppModel {
    public $belongsTo = array(
        'Attraction ', 'AttractionAccessibility '
    );
}