Ben doğru Doktrin altsınıflara yapıyorum?

1 Cevap php

Ben Doktrini bir POS sistemi inşa etmeye başladı. Ben bir sipariş alıyorum, ama ben bile Doktrini için uygun şekilde alt sınıfları kurmak olsun ya da olmasın hiçbir ipucu var.

Burada bir sipariş üzerine satır öğeleri için geldi modeli

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

Veritabanı gibi görünüyor. Tip 1 (kira) veya 2 (satın alma) ya da bir

İşte satır öğesi sınıf

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'));
  }
}

İşte rentLineItem sınıf (buyLineItem benzer)

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'));
}
}

İşte nesneleri çağrı var kodu

$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++;
    }
  }
}

İşte ben alıyorum hata

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

1 Cevap

Bir $ Ekle Bu-> hasColumn ('tip', 'int'); alt sınıf çağrı üstünde. Eğer subclassing için kullanmadan önce ilk sütunu bildirmek zorunda.

Ayrıca, alt sınıf setTableDefinition aramalar, bir ebeveyni :: setTableDefinition () ekleyin; üstünde deyimi. Ayrıca setUp () yöntemleri ile aynı şeyi. Bu olabilir ya da sorunu çözmek değil, ama bu ileride sorunlara neden olabilir. Doğrudan sorguladığınız sürece Doktrini ilişki koleksiyonları nemlendirir zaman, atıfta konum ne gelince, ben bana aynı şeyi yaptı sütun toplama miras kullanılan son kez ... Bu sadece desteklenmiyor olabilir.