如何实现CRUD与很多:很多关系

时间:2014-01-10 13:24:07

标签: php crud atk4

我是atk4的新手,但我找不到一些使用CRUD的简单示例:表之间的许多关系。

我在一些说明中读到M:M最好用中间表实现,这似乎是合乎逻辑的。

例如

Model ONE has:
$this->hasMany('Table1Table2','table1_id');

Model TWO has:
$this->hasMany('Table1Table2','table2_id');

And Intermediate Model (Table1Table2) has:
$this->hasOne('Table1');
$this->hasOne('Table2');

Wich生成这张桌子,没关系:

create table table1table2 (  
  id int auto_increment not null primary key,
  table1_id varchar(255),
  table2_id varchar(255));

但是如何实现CRUD? - 如何实施列表,添加新的,编辑等..

在页面上我只需插入如下:

$this->add('CRUD')->setModel('Table1');

没有生成任何关系...用户可以从table2中选择(在添加和编辑table1时)值。

从阅读和阅读教程我有想法,但也许是完全过度工作,所以我真的问这个问题ATK4最好的方法是什么?

我的想法:

  • 添加多个下拉列表以编辑和添加表单,并使用table2值填充它。如果在编辑中,请在中间表中检查已经检查的内容。
  • 扩展基本CRUD,在formSubmitSuccess上将所选值从下拉列表插入到中间表
  • 以不同方式进行编辑/添加新..
  • 之后,对GRID和其他东西进行类似的检查......可以产生大量的额外工作..

所以,我看到它可行,但我很害羞M:M关系非常普遍(它基本上是两个1:M),所以也许有更好的解决方案?

提前谢谢。

2 个答案:

答案 0 :(得分:1)

您需要创建代理表并在三个表之间创建一对多关系

class Model_Admin extends Model_Table {
    function init() {
        parent::init();
        $this->haveMany('AdminApp');
    }
}

class Model_App extends Model_Table {
    function init() {
        parent::init();
        $this->haveMany('AdminApp');
    }
}

// this is proxy table
class Model_AdminApp extends Model_Table {
    function init() {
        parent::init();
        $this->haveOne('Admin');
        $this->haveOne('App');
    }
}

实际上没有其他方法可以创建多对多关系

答案 1 :(得分:1)

毫无疑问,您需要在关系数据库设计中使用中间表。

问题是,您如何定义模型。正如您已经解释过的那样,一种解决方案是使用3种模型。但是,您也可以使用两个模型执行类似操作,并在模型定义中使用连接将它们直接连接到中间数据库表。 这里的想法是 - 模型与DB表一般不同。模型比DB表更重要。一个模型可以像10个表一样加入并做一些奇特的事情:)

我猜这种界面(View)没有适合所有需求的开箱即用的解决方案。但在某些情况下,如果您只需要在两个表之间设置链接(是/否),则可以使用form + grid + grid-> addSelectable()或form + crud + crud-> grid-> addSelectable( )。通过这种构造,您可以将多个用户角色与用户或应用程序关联到管理员或将喜欢的颜色关联到人等。

如果中间表中有更多数据字段而不仅仅是链接id,那么你必须提出一些自定义代码。但我想你仍然可以看一下grid-> addSelectable()方法来抓住一些想法。

P.S。对不起,这次我没有现成的例子:)