Hi,
I have a problem with Zend_Db_Table / Zend_Db_Table_Abstract and would like to ask for some advice.
In my current project I am trying to support both MySql and Oracle Databases.
I am using subtypes of Zend_Db_Table defining objects representing my database tables on the php side, a simple example:
[code]
class Model_MailWorklist extends Zend_Db_Table
{
protected $_schema = 'ONLINEMARKETING';
protected $_name = 'BACKGROUND_MAIL_WORKLIST';
protected $_primary = 'ID';
protected $_sequence = 'ONLINEMARKETING.COUNTER_BG_WORK';
}
[/code]
As one may have noticed I am using sequences with my Oracle database, so something like this just works fine:
[code]
...
$_mailWorkList = new Model_MailWorklist();
$_nextPrimaryKey = $_mailWorkList
->insert
(
array
(
'SUBSCRIBER_ID' => $_singleTransferRecipientId,
'NEWSLETTER_ID' => $_newsletterDispatchNewsletterId,
'DISPATCH_DATE' => $newsletterDispatchDateTime,
'DISPATCHED' => 0,
'DISPATCH_TYPE' => 'main'
)
);
...
[/code]
Now I am tying to use the same code with my MySql Database, which rather uses [i] auto_increment [/i], instead of sequences.
Sine I need to define [i] protected $_sequence [/i] for handling my Oracle database, I hoped that for the MySql case Zend_Db_Table will just ignore the specified sequence and the [i]insert()[/i] function returns the next inserted primary key. But as long as [i] protected $_sequence [/i] is set to some string value in my Model_MailWorklist-Class, Zend will try to use it and the [i]insert()[/i] function just returns [i]FALSE[/i]. The responsible Framework code:
[code]
abstract class Zend_Db_Table_Abstract
{
...
protected $_sequence = true;
public function insert(array $data)
{
...
if (is_string($this->_sequence) && !isset($data[$pkIdentity])) {
$data[$pkIdentity] = $this->_db->nextSequenceId($this->_sequence);
}
...
[/code]
:\ ... Now I dislike the solution of adding a check for the database type currently active to every init method of subtypes of Zend_Db_Table and set [i]$this->_sequence [/i] if running on Oracle.
My current "brute force solution" is extending Zend_Db_Table, lests say ZendX_Db_Table:
[code]
class ZendX_Db_Table extends Zend_Db_Table
{
public function __construct($config = array(), $definition = null)
{
parent::__construct($config, $definition);
$this->set_transparent_sequence();
}
private function set_transparent_sequence()
{
if( $this->_db instanceof Zend_Db_Adapter_Pdo_Mysql )
{
$this->_sequence = true;
}
}
}
[/code]
The only problem, now I need to use ZendX_Db_Table instead of Zend_Db_Table in my whole application. My question is, is there maybe a more efficient way instead of introducing a whole new class level to my application, just to make Zend ignore sequences when working with MySql?
Is this even a Zend-Bug or does this behaviour make sense and there is a reason supporting sequences in MySql?
Regards,
Richard Tantius
Software Engineer
Gotenstr. 7-9
53175 Bonn
Tel.: +49 (0)228 / 4 22 86 - 32
Fax.: +49 (0)228 / 4 22 86 - 66
E-Mail: r.tantius@binserv.de
Web: www.binserv.de
www.binforcepro.de
Geschäftsführer: Rüdiger Jakob
Registergericht: Siegburg HRB 6765
Hauptsitz der Gesellschaft.: Pfarrer-Wichert-Str. 35, 53639 Königswinter
Diese E-Mail einschließlich eventuell angehängter Dateien enthält vertrauliche und/oder rechtlich geschützte Informationen. Wenn Sie nicht der richtige Adressat sind und diese E-Mail irrtümlich erhalten haben, dürfen Sie weder den Inhalt dieser E-Mail nutzen noch dürfen Sie die eventuell angehängten Dateien öffnen und auch nichts kopieren oder weitergeben/verbreiten. Bitte verständigen Sie den Absender und löschen Sie diese E-Mail und eventuell angehängte Dateien umgehend. Vielen Dank!