Codeigniter: моделирует вопросы! - PullRequest
2 голосов
/ 21 января 2010

У меня только что возникли сомнения по поводу моделей ...

Это мой первый проект на 100% MVC (вроде) ... я сомневаюсь ... когда я выполняю функции объединения, объединения или что-то еще с несколькими таблицами ... как мне это сделать? использовать тот же файл модели "основной таблицы" или мне нужно создать новый файл модели с использованием двух или каких-либо таблиц ??

ТКЗ ... Роберто!

Ответы [ 2 ]

4 голосов
/ 21 января 2010

Вы можете делать это как хотите. Модель не может иметь , ограниченную одной таблицей, вы можете ПРИСОЕДИНЯТЬСЯ, ОБЪЕДИНЯТЬ и ОБНОВЛЯТЬ любую таблицу, которая вам нравится, откуда угодно.

В дополнение к предложениям Донни Курнии, очень хорошая существующая модель MY_Model уже была написана Джейми Рамблоу (с некоторыми комментариями от меня самого), которая содержит несколько методов get, count, insert и т.д. Это позволяет вам выполнить большинство основных требований CRUD просто, создав пустую модель, которая расширяется от MY_Model.

Это отлично подходит для получения / вставки / удаления из одной таблицы, но когда дело доходит до создания методов, требующих объединения, лучше всего написать их самостоятельно.

При объединении таблиц вам необходимо установить WHERE на основе имен / псевдонимов таблиц, и вы найдете конфликтующие имена полей, если не будете осторожны, что означает, что создание общего решения для управления всеми запросами объединений из MY_Model будет ОЧЕНЬ ОЧЕНЬ трудно или просто беспорядок.

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

}

Вот пример очень простой модели, с которой я сейчас работаю, которая показывает, как я комбинирую использование MY_Model для get, get_by, insert, update с некоторыми пользовательскими методами, в которых есть объединения и дополнительные данные.

Вы также можете видеть, как я перегружаю insert (), чтобы автоматически добавлять дату создания без необходимости устанавливать ее в каждом контроллере, который может создавать или обновлять заявку.

Если вам нужно еще больше волшебного автоматического безумия столярного дела, попробуйте ORM с чем-то вроде Doctrine или DataMapper

3 голосов
/ 21 января 2010

Я хотел бы поделиться своим подходом к этому.

Сначала я создал свой собственный класс MY_Model, который имеет метод get_detail, get_total, get_list, get_all, insert, update и delete. Я поместил этот класс в папку system/application/libraries. Этот класс extends Класс модели CI. Все связанные запросы в этом классе, используя $this->tablename. Тогда фактическому классу модели понадобится только этот код, чтобы он заработал:

class Product_model extends MY_Model {

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

}

Когда мне нужно объединить две таблицы или более, я помещаю код в модель основной таблицы. Пример: у меня есть таблицы product, category и user. Если мне нужно получить продукт с именем категории и именем пользователя, который вставляет данные, тогда «основной» таблицей будет продукт. У меня будет этот метод внутри 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
}

При таком подходе у меня все еще будет функция get_list, которая возвращает столбцы только из таблицы product, а также функция get_list_joined, которая возвращает столбцы из таблицы product, таблицы category и user таблица.

Важно сначала определить основной класс, чтобы не было нескольких методов, выполняющих одинаковые действия.

Чтобы выполнить объединение, достаточно включить в базу данных класс базы данных. Но я предпочитаю использовать AdoDB в качестве библиотеки базы данных. Он предлагает больше поддержки баз данных, чем CI. Но для начала, и вы используете только MySQL, тогда базы данных CI достаточно. Изучи это по одному.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...