Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何使用多:多关系实现CRUD_Php_Crud_Atk4 - Fatal编程技术网

Php 如何使用多:多关系实现CRUD

Php 如何使用多:多关系实现CRUD,php,crud,atk4,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) h

我不熟悉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');
这将生成此表,这是确定的:

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');
没有生成任何关系。。。如果用户可以从表2中选择(在添加和编辑表1时)值,那就太好了

通过阅读和观看教程,我有了一些想法,但可能是工作过度了,所以我真的想问,在ATK4上解决这个问题的最佳方法是什么

我的想法是:

  • 添加多个下拉列表以编辑和添加表单,并使用table2值填充表单。如果在“编辑”中,请检入已检入内容的中间表
  • 扩展基本CRUD,在表单SubmitAccess上从下拉列表中插入选定值到中间表
  • 对“编辑/添加新内容”执行不同的操作
  • 稍后,对网格和其他内容执行类似的检查。。。可以产生很多额外的工作

所以,我认为它是可行的,但我确信m:m关系非常常见(基本上是两个1:m),所以可能有更好的解决方案吗?

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

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

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

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

问题是,如何定义模型。一个解决方案是,正如您已经解释的那样,使用3个模型。但您也可以只使用两个模型执行类似的操作,并在模型定义中使用联接将它们直接联接到中间DB表。 这里的想法是-一般来说,模型和DB表不一样。模型不仅仅是DB表。一个模型可以连接10张桌子,并用它们做一些有趣的事情:)

我想对于这样的界面(视图),没有现成的解决方案可以满足所有的需求。但在某些情况下,如果只需要设置两个表之间的链接(是/否),则可以使用form+grid+grid->addselective()或form+crud+crud->grid->addselective()。例如,通过这种构造,您可以将多个用户角色与用户关联,将应用程序与管理员关联,或将喜爱的颜色与人关联等

若在中间表中有更多的数据字段,而不仅仅是链接id,那个么就必须编写一些自定义代码。但我想您仍然可以浏览一下grid->addSelectable()方法来获取一些想法


另外,很抱歉,这次我没有现成的示例:)

是的,我确实这样做了(如上所述)。我要问的是,如何用CRUD或GRID实现选择。。我描述了我的想法,但我真的不是舒尔,这是正确的方法还是有更好的方法?谢谢你的帮助!感谢您的解释:)已经有了新问题:)您还可以检查表单\字段\复选框列表是如何工作的。也许你可以使用它。我会尝试使用下拉列表和setAttr('multiple'),但我猜最后是一样的。。