Как связать три таблицы MySQL с помощью Zend? - PullRequest
0 голосов
/ 29 июля 2011

У меня проблема.У меня есть три таблицы в MySQL, одна содержит теги , одна содержит сообщений , а третья содержит ссылки на теги и сообщения с использованием идентификаторов.Когда я добавляю сообщение, содержащее теги, я вставляю теги, а затем делаю ссылки между таблицами.Теперь у меня есть две родительские таблицы (теги и записи) и один дочерний, который связывает их. Моя цель : когда я удаляю сообщение, я хочу удалить все ссылки между тегами и сообщениями, а также удалить теги, которые не связаны с другими сообщениями, но зависят от сообщения, которое я удалил.Вот мои столы.Я знаю, что они плохо связаны.Я думал, что если я сделаю посты родительскими для posts_tags и posts_tags parent для тегов, это решит мою проблему, но в случае обнаружения на каскаде сообщений, теги также будут удалены.Я хочу, чтобы они были удалены, только если между ними и другими постами нет ссылок.Я забыл упомянуть, что столкнулся с этой проблемой, используя 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 ]

1 голос
/ 29 июля 2011

вам нужен более мощный слой абстракции БД.посмотрите, например, http://www.doctrine -project.org / .

Zend_Db действительно хорош.Мои сценарии cli / cron часто используют его в качестве вторичного уровня БД, но если вам нужно больше, вам придется использовать другие инструменты или написать (построить) sql вручную.это можно сделать с помощью zend_db - 3 или более запросов ... но ...

0 голосов
/ 05 августа 2011

пытались ли вы использовать защищенные $ _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();
...