У меня два стола products
а также categories
Я хочу получить все продукты с названием их категории.
Таблица продуктов (продукты)
id (auto_increment) | Name(varchar) | category_id(int) | price(decimal) | user_id(int)
Таблица категорий (категории)
id(auto_increment) | name(varchar)
Обязательный запрос: SELECT * FROM products p INNER JOIN categories c ON (p.category_id = c.id) WHERE p.user_id = 1
Модель product.php
class Product extends DataMapper {
var $has_many = array('category');
var $validation = array(
'name' => array(
'label' => 'Name',
'rules' => array('required', 'trim', 'alpha_dash', 'min_length' => 3),
),
'category_id' => array(
'label' => 'Category Id',
'rules' => array('required', 'trim', 'alpha_dash'),
),
'price' => array(
'label' => 'price',
'rules' => array('required', 'trim', 'alpha_dash'),
),
'quantity' => array(
'label' => 'quantity',
'rules' => array('required', 'trim', 'alpha_dash'),
),
);
function get_product_from_userid($product_id){
$product_obj = new Product($product_id);
$product_obj->category->get();
}
}
Модель category.php
class Category extends DataMapper {
var $table = 'categories';
var $has_many = array('product');
}
Контроллер (пользователи)
class Users extends CI_Controller {
function Users(){
parent::__construct();
$this->load->helper('url');
$this->load->helper('form');
}
function index(){
$product_obj = new Product();
$product_obj->user_id = 1;
$product_id = 1;
$product_obj->get_product_from_userid($product_id);
}
}
Кажется, что Datamapper ORM для CodeIgniter не имеет возможности выполнять INNER JOIN, и по умолчанию используется LEFT OUTER JOIN.
Поэтому я бы использовал ActiveRecord для вашего запроса INNER JOIN.
$result_set = $this->db->join('categories', 'categories.id = products.category_id')->where('user_id = 1')->get('products')->result_array();
Источник: я использую DataMapper ORM в своей работе.
Других решений пока нет …