CakePHP birden fazla tablodan ilgisiz verilerin gerektiren bir yöntem oluşturmak için nasıl

4 Cevap php

Ben birden fazla tablodan ilgisiz verileri gösteren bir görünüm yapmak zorunda. Ben (ve genel olarak PHP) CakePHP için yeni ve kadarıyla benim anlayış gider gibi, her model sadece bir tablonun bir anlatımıdır. Ben diğer tablolarla ilişkileri tanımlamak olduğunu biliyorum, ama benim durumumda görünüm açılacak bulunuyor modeli ile ilgili hiçbir şekilde veri erişimi vermek gerekir.

Example: Say there is a blogging platform and we are currently viewing a post. (Model - Post, function - Read). Now I want a list of (Say) subscribers of our newsletter. This data is not related to the model and hence, I don't think the data will be accessible to the controller. Please tell me how to get this data in view directly.

4 Cevap

Sınıf tanımlarken sizin denetleyicisi, bir sınıf niteliği $ eklemek modelleri yüklemek için denetleyicisi anlatmak için kullanır.

class SomeController extends AppController {
    public $name        = 'Some';
    public $uses        = array( 'Model1', 'Model2' );}

Ve sonra, yöntemi, sadece bu modeli diyoruz:

$result = $this->Model1->find('all');
$result2= $this->Model2->find('all');

Bunu yapmak için bir kaç yolu vardır. İşte gwoo Hadi onlar farklı nasıl sinopsis ve ne zaman hangi kullanmak için:

App::import() only includes the file. So you would new to create a new instance every time. This is not recommended

ClassRegistry::init() loads the file, adds the instance to the a object map and returns the instance. This is an easy and convenient way to access models.

Controller::loadModel(); Uses ClassRegistry::init() adds the model to a property of the controller and also allows persistModel to be enabled.

While you "can" do any of these things, you should ask yourself why you are creating dependencies on models that are not natural to the controller. If you "have" to do use any of these, then I would do so in reverse order of the way i described them. IE, Controller::loadModel () then CR::init() and actually I never use App::import() for models. Hope this helps.

Tam tartışma için bu sayfaya bakınız: http://groups.google.com/group/cake-php/browse_thread/thread/137c57b4eb010317

Buna ek olarak, diğer bazı cevaplar $uses dizideki ilgisiz modeli de dahil olmak önerdi, ama gerçekten veritabanı tablo kullanmak modelini anlatmak için tasarlanmıştır ve üyeleri merkezi olduğunu ima gibi ben bu yöntemi önleyeceğini Eğer tarif durum böyle değil modelinin amacına.

Eğer aynı modelde fonksiyonların bir çift bunu kullanmak için gidiyoruz, sen yoluyla Kontrol içine belirtmeniz gerekir:

$uses = array('Post', 'Suscriber');

Bu düzen bir elemnt Şimdi eğer, bir öğe üzerinde ayarlamanız gerekir.

Görünümünde:

$ This-> renderElement ('suscribers-list');

Şimdi views / elemanları bir suscribers-list.ctp dosyası oluşturmanız gerekir. Oradan modelini ithal:

App::Import('Model', 'Suscriber');
$this->Suscriber = new Suscriber();

$suscribers = $this->Suscriber->find('all');
pr($suscribers);

Bu hoş değil, ama bu benim için çalışıyor ne. Başka bir yolu varsa ben bilmiyorum.

Daha az kod ile bunu, biraz daha basit ve edebilirsiniz. Sen AppController::loadModel('ModelName') yararlanabilirler. (reference) Bu yöntem olur öyleyse o önerdi metrobalderas o initilization adım önemser

$this->loadModel('Subscriber');
$subscribers = $this->Subscriber->find('all', ... );

Sadece loadModel('ModelName'); fakat AppController yöntem oldu 1,2 önerilmiyor bir işlevi vardı. Ayrıca bu MVC ruhu değil gerçekten olduğu gibi doğrudan bir eleman modelleri yük gerektiğini belirtmek gerekir. Modelde tutun. Bu yöntemi kullanarak oldukça var $uses = array('ModelName'); ihtiyacı, hem de bu yaklaşım kullanıldığında ortaya çıkabilecek komplikasyonlar bazı azaltır olmayan yöntemlerde ilgisiz modellerin yükü azaltmak yapar.