Doatrine Fatal Error - Неизвестный псевдоним отношения - PullRequest
2 голосов
/ 16 апреля 2010

Я получаю следующее сообщение об ошибке:

Doctrine_Table_Exception: неизвестный псевдоним отношения shoesTable в /home/public_html/projects/giftshoes/system/database/doctrine/Doctrine/Relation/Parser.php в строке 237

Я использую учение 1.2.2 с Codeigniter

Мой код ниже: (BaseShoes.php и Shoes.php генерируются автоматически)

------------ BaseShoes ------------

<?php
// Connection Component Binding
Doctrine_Manager::getInstance()->bindComponent('Shoes', 'sadiqsof_giftshoes');

/**
 * BaseShoes
 * 
 * This class has been auto-generated by the Doctrine ORM Framework
 * 
 * @property integer $sku
 * @property string $name
 * @property string $keywords
 * @property string $description
 * @property string $manufacturer
 * @property float $sale_price
 * @property float $price
 * @property string $url
 * @property string $image
 * @property string $category
 * @property Doctrine_Collection $Viewes
 * 
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## <##EMAIL##>
 * @version    SVN: $Id: Builder.php 6820 2009-11-30 17:27:49Z jwage $
 */
abstract class BaseShoes extends Doctrine_Record
{
    public function setTableDefinition()
    {
        $this->setTableName('shoes');
        $this->hasColumn('sku', 'integer', 4, array(
             'type' => 'integer',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => true,
             'autoincrement' => false,
             'length' => '4',
             ));
        $this->hasColumn('name', 'string', 255, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '255',
             ));
        $this->hasColumn('keywords', 'string', 255, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '255',
             ));
        $this->hasColumn('description', 'string', null, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('manufacturer', 'string', 20, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '20',
             ));
        $this->hasColumn('sale_price', 'float', null, array(
             'type' => 'float',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('price', 'float', null, array(
             'type' => 'float',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('url', 'string', null, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('image', 'string', null, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '',
             ));
        $this->hasColumn('category', 'string', 50, array(
             'type' => 'string',
             'fixed' => 0,
             'unsigned' => false,
             'primary' => false,
             'notnull' => true,
             'autoincrement' => false,
             'length' => '50',
             ));
    }

    public function setUp()
    {
        parent::setUp();
        $this->hasMany('Viewes', array(
             'local' => 'sku',
             'foreign' => 'sku'));
    }
}

-------------- ShoesTable --------

<?php
class ShoesTable extends Doctrine_Table
{
    function getAllShoes($from = 0, $total = 15)
    {
        $q = Doctrine_Query::create()
        ->from('Shoes')
        ->limit($total)
        ->offset($from);

        return $q->execute(array(), Doctrine::HYDRATE_ARRAY);
    }

}

--------------- Модель обуви -----------------

<?php

/**
 * Shoes
 * 
 * This class has been auto-generated by the Doctrine ORM Framework
 * 
 * @package    ##PACKAGE##
 * @subpackage ##SUBPACKAGE##
 * @author     ##NAME## <##EMAIL##>
 * @version    SVN: $Id: Builder.php 6820 2009-11-30 17:27:49Z jwage $
 */
class Shoes extends BaseShoes
{
    function  __construct() {
        parent::__construct();
        $this->shoesTable = Doctrine::getTable('Shoes');
    }

    function getAllShoes()
    {
        return $this->shoesTable->getAllShoes();
    }

}

Ответы [ 4 ]

6 голосов
/ 24 января 2012

Для всех, кто ищет ответы, я столкнулся с этим сообщением об ошибке, поскольку у меня было

Doctrine_Query::create()->from('Subscription s')->innerJoin('BillingPlan b')

Вместо

Doctrine_Query::create()->from('Subscription s')->innerJoin('s.BillingPlan b')

Отношение должно быть относительно модели, указанной в from ()

1 голос
/ 16 апреля 2010

Не уверен, почему вы получаете эту конкретную ошибку, но, судя по руководству Doctrine, вы не должны определять метод __construct() в вашем Shoes классе (который расширяет BaseShoes, который сам расширяет Doctrine_Record)

Вот раздел руководства Учения, в котором говорится именно это: Переопределение конструктора (цитирование) :

Доктрина не позволяет вам отвергать Doctrine_Record::__construct() метод, но предоставляет альтернативу
[...]

(я не копировал-вставлял все: там есть более интересные вещи ;-))

0 голосов
/ 08 июня 2011

Вы не определили $ shoesTable как свойство объекта Shoes. Добавьте это так:

class Shoes extends BaseShoes
{
    private $shoesTable;

    function  __construct() {
        parent::__construct();
        $this->shoesTable = Doctrine::getTable('Shoes');
    }

    function getAllShoes()
    {
        return $this->shoesTable->getAllShoes();
    }

}

Если вы этого не сделаете, его не существует, и ссылка на него вызовет магический метод __get (), который предоставляет Doctrine. Doctrine будет предполагать, что shoesTable является частью модели данных, и будет искать связь (так как не может найти никаких локальных данных) с этим именем.

Другой, более простой способ сделать это - использовать встроенный метод getTable ():

class Shoes extends BaseShoes
{

    function getAllShoes()
    {
        return $this->getTable()->getAllShoes();
    }

}
0 голосов
/ 30 октября 2010

Удаление конструктора без выполнения каких-либо действий с удаленным кодом, вероятно, не поможет.

Я новичок в Doctrine, но недавно у меня была такая же ошибка (думаю, по разным причинам). Интересно, считается ли атрибут класса $ this-> shoesTable внешним отношением, которое объясняет сообщение об ошибке. В любом случае, вы, вероятно, не хотите иметь табличный метод в классе строк, поэтому я был бы склонен сделать это:

Doctrine_Core::getTable('Shoes')->getAllShoes();

Я знаю, что вряд ли вы все еще этого ждете, но если вы хотите продолжить диалог, опубликуйте свой код вызова.

...