如何使用Zend链接三个MySQL表?

时间:2011-07-29 17:11:33

标签: php mysql zend-framework database-design



我有个问题。

我在MySQL中有三个表,一个包含标记,一个包含帖子,第三个链接标记和帖子使用ID。

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

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

这是我的表格。我知道他们没有很好的联系。我虽然如果我为posts_tags和posts_tags父亲为标签发布帖子会解决我的问题,但是如果从帖子级联中检测到,则标签也将被删除。我希望只有在它们和其他帖子之间没有链接时才删除它们。

我忘了提到我使用 zend framework 遇到了这个问题,我仍然需要解决它winth zend。

posts
Field       Type         Null    Default    Comments
id          int(11)      No           
title       varchar(200) No           
description longtext     No           
address     varchar(100) No           
added       datetime     No           

post_tag
Field     Type      Null    Default    Links to       Comments
id_tag    int(11)    No     0          etichete -> id      
id_post   int(11)    No     0          turism -> id      

tags
Field    Type         Null    Default    Comments
id       int(11)      No           
name     varchar(50)  No

由于

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

您是否尝试使用受保护的$ _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();