1

So I have defined a model like this:

class Model extends Zend_Db_Table_Abstract
{
    $_primary = 'modelID';


    /**
     *
     * @param mixed $primaryKey
     * @return int 
     */
    public function delete($primaryKey)
    {
        $where = $this->getAdapter()->quoteInto($this->_primary.' = ?', $primaryKey);
        return parent::delete($where);
    }
}

When calling the delete method, I get a warning telling me $this->_primary is an array. Why? I have assigned a string value to $_primary property.

From logs:

2012-02-05T17:41:03+00:00 INFO (6): Array
(
    [1] => modelID
)
4
  • I get a warning telling me $this->primary Is that a typo? You've used _primary, not primary. Commented Feb 5, 2012 at 17:13
  • @SimpleCoder Yes it's a typo. Fixed. Commented Feb 5, 2012 at 17:19
  • Hmm. I've never seen this problem before. Can you post a var_dump of the array right before the first line of your delete method? Commented Feb 5, 2012 at 17:29
  • @SimpleCoder I have posted the print_r of the $_primary. Commented Feb 5, 2012 at 17:43

1 Answer 1

5

Zend_Db_Table stores primary keys as an array in case a compound key is used, so strictly speaking, it is best (not compulsory) to declare them like this:-

class Model extends Zend_Db_Table_Abstract
{
    public function __construct(array $config = null)
    {
        $this->_primary[1] = 'modelId';
        parent::__construct($config);
        //.............

From the docblock in Zend_Db_Table_Abstract:-

/**
 * The primary key column or columns.
 * A compound key should be declared as an array.
 * You may declare a single-column primary key
 * as a string.
 *
 * @var mixed
 */
protected $_primary = null;

And from the dockblock for $_identity:-

/**
 * If your primary key is a compound key, and one of the columns uses
 * an auto-increment or sequence-generated value, set _identity
 * to the ordinal index in the $_primary array for that column.
 * Note this index is the position of the column in the primary key,
 * not the position of the column in the table.  The primary key
 * array is 1-based.
 *
 * @var integer
 */
protected $_identity = 1;

So you could probably use that instead.
If you have only one column in your primary key then it will be at $_primary[1].

I think this would work for you:-

public function delete($primaryKey)
{

    $where = $this->getAdapter()->quoteInto($this->_primary[1] .' = ?', $primaryKey);
    return parent::delete($where);
}
Sign up to request clarification or add additional context in comments.

7 Comments

+1 @vascowhite: I've deleted my answer since yours explains this much better.
@vascowhite. I think this might be a bug in Zend. Because in some of my unit tests $_protected is array, in others it is a string...
$_protected? do u mean $_primary? If you have extended Zend_Db_Table_Abstract then $_primary is an array. Check the actual code and you will see.
You are obviously getting a mix of behaviours, you could always declare your primary keys as arrays to keep things consistent. I don't think what you are seeing is a bug as it is clearly described in the docs.
Extending Zend_Db_Table like this is not good for unit testing. You should be injecting an instance of it as a dependancy.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.