Zend: Bir ürünler tablo için model oluşturma

2 Cevap php

Ben üreticileri çekme gibi ürünler, gerekirse admin bunları düzenlemek ve her zamanki CRUD şeyler böylece ben, iki model oluşturmak için çalışıyor products ve product_manufacturers ediyorum. İşte tablolar için şema bulunuyor (bu değil finalized bu yüzden varsa herhangi bir öneriniz devam).

CREATE TABLE `product_manufacturers` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `manufacturer_name` varchar(100) default NULL,
  `active` tinyint(1) default '1',
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

CREATE TABLE `products` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `product_name` varchar(100) default NULL,
  `manufacturer_id` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

Örnek veri:

(Ürünler) -

id product_name manufacturer_id
1  iPod Nano 4g 1

(Product_manufacturers) -

id manufacturer_name active
1  Apple             1

Ben iki model oluşturduk, ama aktif ürün üreticileri (ve evet, ben bir model autoloader kullanıyorum) dayalı ürünlerde çekerek sorun yaşıyorum.

protected function _initAutoload ()
{
    // Add autoloader empty namespace
    $autoLoader = Zend_Loader_Autoloader::getInstance();
$resourceLoader = new Zend_Loader_Autoloader_Resource(
    array(
	'basePath' => APPLICATION_PATH ,
	'namespace' => '' ,
	'resourceTypes' => array(
	    'form' => array('path' => 'forms/' ,
	    'namespace' => 'Form_') ,
	    'model' => array('path' => 'models/' ,
	    'namespace' => 'Model_')
	)
    ));
    // Return it so that it can be stored by the bootstrap
    return $autoLoader;
}

application / modeller / product.php:

<?php
require_once 'Zend/Db/Table/Abstract.php';

class Model_Product extends Zend_Db_Table_Abstract
{
    /**
     * The default table name 
     */
    protected $_name = 'products';
    protected $_dependentTables = array('Model_Manufacturer');
}

application / modeller / Manufacturer.php:

class Model_Manufacturer extends Zend_Db_Table_Abstract
{
    /**
     * The default table name 
     */
    protected $_name = 'product_manufacturers';
    protected $_referenceMap = array(
 'Model_Product' => array(
     'manufacturer_id' => array('id'),
     'id' => array('manufacturer_id'),
 ),
    );
}

Ben Ürünler Model bir nesne oluşturma ve karşılık gelen bir üretici olan tüm ürünleri yazdırmak çalışıyorum ben, tamamen yanlış şeyler yapıyorum bir duygu var ve bu üretici etkin.

 $model = new Model_Product();
 $results = $model->fetchAll();
 foreach ($results as $result) {
     //print_r($result);
     echo $result->product_name;
 }

Herkes ürünleri model düzgün üreticileri modeline dayanır ki ben düzgün benim şimdiki kodunu değiştirmek nasıl konusunda tavsiye verebilir ben, model oluşturma yeniyim?

Ben yanlış dependentTables / referenceMap, ve bunun yerine getiriliyor yapmak modelinde de özel bir yöntem yaratmak olmalıdır ve belki bir manuel katılmak jenerik fetchAll yöntemini kullanarak ayar bir his var üreticileri tablo ile, ya da uygun bir referenceMap ve dependentTables özellik bu sorunu çözmek istiyorsunuz?

2 Cevap

Orada burada düzeltmek için bir kaç şey vardır, ama burada birkaç ipucu.

i. Isimleri çoğul ise masa modelleri biraz daha iyi çalışır. Onlar sihirli yöntemler daha iyi ses (yerine findModel_Product örneğin $ product_set = findProducts () ())

ii. Referans haritası önemli biridir ve çalışmak için bu şık sihirli seçme yöntemleri (örneğin findParentX ()) için izin verir. Bu product_manufacturer başvuran çünkü burada product tablodur dependent tabloda, aittir.

  // in Model_Product
  protected $_referenceMap = array(

    // rule name
    'Manufacturer' => array(

      'columns'       => 'manufacturer_id',     // this column
      'refTableClass' => 'Model_Manufacturer',  // references that table object
      'refColumns'    => 'id'                   // and references that column
    )
  );



iii. Move dependent tables entry to your product_manufacturers table model, if you'd like: it's used only to replicate ON DELETE/UPDATE CASCADE database commands, though. (Leave it for now)

// in manufacturer table model
protected $_dependentTables = array('Model_Product');



Fetching

Bir ürünün üreticisini almak için, şunu yapın:

$manufacturer = $product_row->findParentManufacturer();


To get a manufacturer's products, do this:

$product_set = $manufacturer_row->findProducts(); // Well, findModel_Product(), which is why you should rename your table ;)


For other magic methods originating from each single row, dig into the source code for Zend_Db_Table_Row_Abstract (especially public function __call).

i referans haritalar hayata geçirdik ve ben $ childObject-> findParentObject () yöntemi-bir alt nesne tek örnekleri için iyi çalışır kullanarak bir kayıt ebeveynin ayrıntıları almak ediyorum.

Ancak ben () yöntemi almak için findParentObject kullanarak, şu anda bu geçme sonra belirlenen ilk kaydı almak için bir seçme yapıyor içerir olsa, hangi [teşhir amaçlıdır] birden fazla çocuk satır için üst nesnelerin ayrıntılarını almak için bu kullanarak bir sorunu var ben bu kayıt için istediğiniz. böylece ben referans haritası görmezden ve tamamen referans haritası atlayarak, bunun için katılmak yapmaya karar verdik. Bu iyi çalışır, bir tek seçin ve hızlı olmasıdır.

benim sorum o isimli bir sorgu kullanarak, aynı sonuçları elde etmek için referans haritayı kullanarak güzel bir yolu var mı? saflık uğruna i gerekenleri yapmak için kullanıyor olmalıdır gibi hissediyor rağmen ben şu anda referans haritası kullanıyorum yolu, biraz yapmacık geliyor ...

soymak GANLY