Codeigniter: Modeller sorular!

2 Cevap php

ben sadece modelleri hakkında bu şüphe var ...

Bu benim ilk% 100 MVC projesi (tür) ... benim şüphe ... Bu nasıl bir katılmak, sendika veya birden fazla tablo ile ne fonksiyon ... ne hasta yaparsınız? "ana tablo" aynı modeli dosyayı kullanmak ya da ben iki veya ne olursa olsun tabloları kullanarak yeni bir model dosyası oluşturmanız gerekir?

Tkz... Roberto!

2 Cevap

Ancak sizin gibi bunu yapabilirsiniz. Bir model have tek bir tablo ile sınırlı olmak değil, sen JOIN, UNION ve yerden istersen tablo UPDATE.

Donny Kurnia önerileri ilerletmek için, çok iyi bir mevcut MY_Model zaten birkaç almak, saymak, insert, vb yöntemler içeren (OFC kendimden birkaç katkılarıyla) Jamie Rumbleow tarafından yazılmıştır. Bunlar MY_Model uzanan boş bir model oluşturarak basit, en temel CRUD gereksinimleri yapmak izin verir.

Bu bir tablo get / insert / delete için harika ama katılmadan gerektiren yöntemleri oluşturmaya gelince, yapılacak en iyi şey sadece bunları kendiniz yazmak edilir.

Tabloları birleştirmek tablo adları / aliases dayanıyor NEREDE ayarlamak gerekir ve eğer dikkatli değilseniz tüm MY_Model sorgular katıldı yönetmek için genel bir çözüm oluşturma ya ÇOK zor ya da sadece olacak çakışan alan adlarını bulacaksınız Bir karmaşa.

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');

class Tickets_m extends MY_Model
{
    // Basic get, insert, delete stuff handled in MY_Model

    function get_client_tickets($category_slug = '')
    {
        $this->db->select('t.*')
            ->select('c.title as category_title, c.slug as category_slug')
            ->select('p.name as priority_name')
            ->join('categories c', 'c.id = t.category_id')
            ->join('priorities p', 'p.id = t.priority_id')
            ->from('tickets t')
            ->where('c.client_id', CLIENT_ID);

        if($category_slug)
        {
            $this->db->where('c.slug', $category_slug);
        }

        return $this->db->get()->result();
    }

    function get_client_ticket($id)
    {
        $this->db->select('t.*')
            ->select('c.title as category_title, c.slug as category_slug')
            ->select('p.name as priority_name')
            ->join('categories c', 'c.id = t.category_id')
            ->join('priorities p', 'p.id = t.priority_id')
            ->from('tickets t')
            ->where('c.client_id', CLIENT_ID)
            ->where('t.id', $id);

        return $this->db->get()->row();
    }

    function insert($ticket)
    {
        $this->load->helper('date');

        $ticket['created_on'] = now();

        return parent::insert($ticket);
    }

}

İşte bunlardan bazı özel olması katılır yöntemleri ve ekstra veri güncelleme, bana olsun, get_by, insert için MY_Model kullanımını birleştirerek gösterir anda ile çalışıyorum çok basit bir modelinin bir örneğidir.

Sen de bana otomatik oluşturma veya bilet güncelleme olabilir her denetleyici bunu ayarlamak gerek kalmadan oluşturulan tarih eklemek için insert () yüklenme görebilirsiniz.

Hatta daha büyü oto-matik doğrama delilik gerekiyorsa, Doctrine veya DataMapper gibi bir şey ile ORM deneyin

Bunun için benim yaklaşım paylaşmak istiyorum.

İlk olarak, get_detail, get_total, get_list, get_all, {[sahip kendi MY_Model sınıf yapılan (5)]}, update ve delete yöntemi. Ben klasörün system/application/libraries klasöründe bu sınıf koydu. Bu sınıf extends CI Model sınıfı. Bu sınıftaki tüm ilgili sorgu kullanarak $this->tablename. Sonra gerçek model sınıf çalışması yapmak için sadece bu koda ihtiyacınız olacaktır:

class Product_model extends MY_Model {

  function Product_model()
  {
    parent::MY_Model();
    $this->tablename = 'product';
  }

}

Ben 2 tablolar veya daha fazla katılması gerektiğinde, ben ana tablonun modeli kod koymak. Örnek: product, category, ve user tablo. Ben veri eklemek kategori adı ve kullanıcı adı ile, ürün almak gerekiyorsa, o zaman 'ana' tablosu ürün olacaktır. Ben bu yöntemi olacaktır içeride Product_model:

function get_list_joined($start=0, $item_num=10, $condition='', $order_by='')
{
  //do query for product, left join to category and user table
  //return result
}

Bu yaklaşımı kullanarak, ben hala sadece product tablo sütunları dönmek, ve aynı zamanda {[(1) den sütun dönmek get_list_joined işlevi var get_list işlevi olacak }] tablo, category masa ve user tablo.

Bu aynı şeyleri yapmak, birden çok yöntem zorunda kalmamak için, ilk ana sınıf belirlemek için önemlidir.

Katılmak edersiniz, CI dahil veritabanı sınıfı yeterlidir. Ama veritabanı kütüphanesi olarak AdoDB kullanmayı tercih. Bu CI en fazla veritabanı desteği sunuyoruz bulunuyor. Ama başlangıç ​​için, ve sadece daha sonra CI veritabanı yeterli, mysql kullanabilirsiniz. O bir anda öğrenirler.