【问题标题】:How to link three MySQL tables using Zend?如何使用 Zend 链接三个 MySQL 表?
【发布时间】:2011-10-16 03:19:09
【问题描述】:



我有个问题。

我在 MySQL 中有三张表,一张包含 tags,一张包含 posts,第三张 links tags and posts 使用 ids。

当我添加包含标签的帖子时,我会插入标签,然后在表格之间建立链接。现在我有两个父表(标签和帖子)和一个链接它们的子表。

我的目标:当我删除一个帖子时,我想删除标签和帖子之间的所有链接,我还想删除与其他帖子没有链接但依赖的标签在我删除的帖子上。

这是我的桌子。我知道他们没有很好的联系。我认为,如果我将 posts_tags 设为 posts_tags 父级,将标签设为 posts_tags 父级将解决我的问题,但如果从帖子中级联删除,标签也将被删除。只有当它们与其他帖子之间没有链接时,我才希望它们被删除。

我忘了说我使用 zend 框架 遇到了这个问题,我仍然需要在 zend 中解决它。

帖子
字段类型 Null 默认注释
id int(11) 否
标题 varchar(200) 否
描述 longtext 否
地址 varchar(100) 否
添加日期时间 否

post_tag
字段类型 Null 默认链接到评论
id_tag int(11) No 0 etichete -> id
id_post int(11) No 0 turism -> id

标签
字段类型 Null 默认注释
id int(11) 否
名称 varchar(50) 否

谢谢

【问题讨论】:

  • “经典查询” - 麻烦只在您的脑海中。如果您可以编写原始 sql 并且知道您在做什么 - 有时这是获得奖品的最快方法 :) 在过去的 10 年里,我根本不使用原始 sql。但application architecture and design 是我的爱好 :) 从小型 ishop 到 1k 并发客户端数据存储
  • mapper 是向 SOA 迈出的一步——它确实是一项“服务”工作,可以返回应用程序期望的数据(对象、数组等)。
  • 如果是,请不要忘记“接受”答案。

标签: php mysql zend-framework database-design


【解决方案1】:

您需要更强大的数据库抽象层。以http://www.doctrine-project.org/ 为例。

Zend_Db 真的很好。我的 cli/cron 脚本经常将其用作辅助数据库层,但如果您需要更多,您必须使用其他工具或手动编写(构造)sql。可以使用 zend_db - 3 个或更多查询...但是...

【讨论】:

  • 除了这个话题,我想知道使用zend处理的经典查询而不是使用Zend_Db_Table是否有问题。另外,在帖子映射器中将所有数据放在一起有什么问题吗?
【解决方案2】:

您是否尝试过使用受保护的 $_dependentTables 和受保护的 $_referenceMap ?这是链接http://framework.zend.com/manual/en/zend.db.table.relationships.html 这是一个例子

class Model_DettagliOrdine extends Gestionale_Model_Abstract_Crud
{

    protected $_name = 'dettagli_ordine';//zend by default assumes table name = class names, we ovveride it
    protected $_primary = 'id';//primary key
    protected $_dependentTables = array('Model_DettagliScontoMerce');//per far si che se cancelliamo qui si cancella anche dall'altra tabella

    protected $_referenceMap = array(

    // rule name
        'Ordine' => array(
            'columns'       => 'ordine_id',     // this column
            'refTableClass' => 'Model_Ordine',  // references that table object
            'refColumns'    => 'id',                   // and references that column
            'onDelete' => self::RESTRICT,
            'onUpdate' => self::CASCADE
        ),
        'Prodotto' => array(
            'columns'       => 'prodotto_id',     // this column
            'refTableClass' => 'Model_Prodotto',  // references that table object
            'refColumns'    => 'id',                   // and references that column
            'onDelete' => self::RESTRICT,
            'onUpdate' => self::CASCADE
        )
    );

....

对于删除的东西,你需要一个像这样的自定义删除函数

// find the row that matches the id
        $current = $this->find($id)->current();
        if (empty($current) || !is_a($current, 'Zend_Db_Table_Row_Abstract'))
        {
            throw new Exception("errore cancellazione riga non trovata");//da tradurre in view o in controller
        }

        //controlla che non ci sono dipendenze
        $dependent = $this->_dependentTables;
        foreach($dependent as $used_by)
        {
            $depends_on = $this->find($id)->current()->findDependentRowset($used_by)->toArray();
            if (!empty($depends_on))
            {
                //$view = Zend_Controller_Front::getInstance()->getParam('bootstrap')->getResource('view');
                //$errore[] = $view->translate('la riga che si vuole cancellare è in uso da un altra tabella', $used_by);
                //throw new Exception($errore);
                throw new Exception("la riga che si vuole cancellare è in uso da un altra tabella");
            }
        }
//      if (!empty($errore))
//          throw new Exception(implode("<br \>\n", $errore));


        $ok = $current->delete();

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 2011-04-12
    • 2021-06-25
    • 1970-01-01
    • 2014-02-24
    相关资源
    最近更新 更多