Pregunta

Empecé a construir un sistema POS en Doctrine. Recibo un pedido, pero no tengo ni idea de si incluso configuré subclases de la manera adecuada para Doctrine.

Aquí está el modelo que se me ocurrió para las líneas de pedido en un pedido

lineItem: line_total, order_id, type
rentLineItem: returned_date_time, item_id, sold
buyLineItem: item_id

La base de datos se ve así. El tipo es 1 (renta) o 2 (compra)

Aquí está la clase lineItem

class lineItem extends Doctrine_Record
{
  public function setTableDefinition()
  {
    $this->hasColumn('line_total','int');
    $this->hasColumn('order_id','int');

    $this->setSubclasses(array(
        'rentLineItem' => array('type' => 1),
        'buyLineItem' => array('type' => 2),
      )
    );
  }

  public function setUp()
  {
    $this->hasOne('order', array('local' => 'order_id', 'foreign' => 'id'));
  }
}

Aquí está la clase rentLineItem (buyLineItem parece similar)

class rentLineItem extends lineItem
{
  public function setTableDefinition()
  {
    $this->hasColumn('returned_date_time','datetime');
    $this->hasColumn('sold','tinyint', 2); // just in case it is sold at the end of the rental
    $this->hasColumn('item_id','int');
  }

  public function setUp()
  {
    $this->hasOne('item', array('local' => 'item_id', 'foreign' => 'id'));
}
}

Aquí está el código que tengo llamando a los objetos

$q = Doctrine_Query::create()
->select('*')
->from('order')
->where('DATE(creation_date_time) = \'' . $theDate . '\'');

$orders = $q->execute();

$totalRents = 0;
$totalSales = 0;

foreach ($orders as $order) {
  foreach ($order->line_items as $lineItem) {
    if ($lineItem->type == 1) {
      $totalRents++;
    } else if ($lineItem->type == 2) {
      $totalSales++;
    }
  }
}

Aquí está el error que recibo

Fatal error: Uncaught exception 'Doctrine_Record_UnknownPropertyException' with message 'Unknown record property / related component "type" on "lineItem"' in 
/Developer/Projects/VEL/lib/vendor/doctrine/Doctrine/Record/Filter/Standard.php:55 Stack trace: #0 
/Developer/Projects/VEL/lib/vendor/doctrine/Doctrine/Record.php(1296): Doctrine_Record_Filter_Standard->filterGet(Object(lLineItem), 'type') #1 
/Developer/Projects/VEL/lib/vendor/doctrine/Doctrine/Record.php(1255): Doctrine_Record->_get('type', true) #2 
/Developer/Projects/VEL/lib/vendor/doctrine/Doctrine/Access.php(72): Doctrine_Record->get('type') #3 
/Developer/Projects/VEL/manage/manage/dailyincomeexpensereport.php(29): Doctrine_Access->__get('type') #4 {main} thrown in 
/Developer/Projects/VEL/lib/vendor/doctrine/Doctrine/Record/Filter/Standard.php on line 55
¿Fue útil?

Solución

Agregue $ this- > hasColumn ('type', 'int'); por encima de su llamada de subclase. Debe declarar la columna primero antes de usarla para la subclase.

Además, en las llamadas de su subclase setTableDefinition, agregue un padre :: setTableDefinition (); declaración en la parte superior. También haga lo mismo con los métodos setUp (). Puede o no resolver su problema, pero eso puede causar problemas en el futuro. En cuanto a lo que se refiere, cuando Doctrine hidrata las colecciones de relaciones, la última vez que usé la herencia de agregación de columnas me hizo lo mismo ... Es posible que simplemente no sea compatible a menos que esté consultando directamente.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top