CodeIgniter Polska Forum

Witamy na polskiej stronie wsparcia CodeIgniter. Nie zapomnij odwiedzić naszej strony głównej

Nie jesteś zalogowany na forum.

#1 23-06-2013 22:48:30

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

DATA MAPER ORM

renholder smile

Ostatnio, zupelnie przpadkowo zreszta, natrafilem na DATA MAPER ORM. Bez dwoch zdan bardzo pozyteczne narzedzie, natomiast z tego co wyczytalem nie mozna podpiac jej pod ostatnia wersje CI tzn 2.0.3 dziala podobno tylko do 2.0.2.

Chcialbym sie dowiedziec czy jest to jedynie wrazenie kogos nie dokonca dobrze poinformowanego czy moze jednak w istocie pracujac na najnowszej wersji CI nie bede mogl sie wesprzec na DATA MAPER'ze ORM.

Druga sprawa to kwestia HMVC, tzn czy istnieja jakies przeszkody, lub specjalne zabiegi, ktore nalezy przedsiewziac aby wykorzystac ta biblioteke w projekcie z zaimplementowanym tym wzorcem projektowym.

Kolejne pytanie, ( ktore ogolnie rzecz biorac ma sens w przypadku niesatysfakcjonujacych mnie odpowiedzi na dwa poprzednie pytania ) czy ze swojej strony moglbys polecic mi inna biblioteke ?

Dziekuje z gory za odpowiedz smile.

Offline

#2 24-06-2013 09:43:37

renholder
Administrator
Data rejestracji: 06-09-2012
Liczba postów: 848

Odp: DATA MAPER ORM

Jeśli chodzi o tą bibliotekę: DataMapper ORM, to z najnowszą, stabilną wersją 2.1.3 nie ma problemów (tak twierdzi autor). Natomiast na razie nie ma kompatybilności z wersją developerską (3.0-dev).

HMVC jest wspierane out of the box: http://datamapper.wanwizard.eu/pages/advancedusage.html

Z popularnych systemów ORM dla CI będą jeszcze:
- Gas ORM
- PHPActiveRecord

Oczywiście do tego dochodzą jeszcze inne możliwości, ale te są chyba najbardziej popularne. Jeszcze ważna informacja odnośnie systemów ORM - ze zwiększonym poziomem abstrakcji dochodzi również zwiekszona konsumpcja zasobów.
Jeśli już będziesz korzystał z jakiegoś ORM'a, to nie musisz na siłę wykonywać wszystkich zapytań do bazy za jego pośrednictwem. Czasami (przy bardziej skomplikowanych zapytaniach) o wiele wygodniej jest skorzystać z dostarczonego przez CI rozwiązania lub nawet zwykłego zapytania SQL pisanego "z palca".

Offline

#3 24-06-2013 10:15:08

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: DATA MAPER ORM

renholder

Dziekuje Ci za odpowiedz.
Mam jeszcze jedno pytanie odnosnie ostatniej czesci Twojej odpowiedzi.

Otoz pobieranie danych niezbednych do zaladowania poszczegolnych modulow obslugiwane jest u mnie poprzez pliki mapperow, ponizej przyklad :

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

//=====================================================================
/** Konfiguracja input'ow dla partial'u rdc strony : */ 
//=====================================================================
$config['mapper']['v']['db_stat']['rdc1cnt']['titles'] = array('id','language'); // labele z tabel bazy danych
$config['mapper']['v']['db_stat']['rdc2cnt']['titles'] = array('id','language'); // labele z tabel bazy danych
//-------------------------------------------------------------------------
$config['mapper']['v']['db_dyn'] = ''; // funkcja przetwarzajaca baze danych
$config['mapper']['v']['clss'] = ''; // funkcja wynikowa zewnetrznej biblioteki
$config['mapper']['v']['session'] = '';
$config['mapper']['v']['post'] = '';
//-------------------------------------------------------------------------
$config['mapper']['v']['db_crs']['rdctmp']['titles'] = array('id','text','hid','htext','level');
$config['mapper']['v']['db_crs']['rdctmp']['orderby'] = array('hid','text');
//-------------------------------------------------------------------------

/* End of file mapper.php */
/* Location: ./application/modules/rdc/config/mapper.php */

gdzie :

v - to marker trybu pracy dla visitor, istnieja rowniez "u" user oraz "a" admin
db_stat - to marker sposobu pobierania danych - w tym przypadku kolumnami
db_crs - wierszami
rdc... - to tablice bazy
titles, orderby, where - to elementy zapytan sql

Informacje pochodzace z takiego mapera przekazywane sa do funkcji, ktore mam umieszczone w My_model, oto przyklad :

    //=====================================================================
    /** _set_module_dbcrs_data */ 
    //=====================================================================       
    function _set_module_dbcrs_data($db_crs,$mode)
    {
        if ($db_crs !== '')
        {                    
            // Aktualizacja "id" :
            //---------------------------------------------------------------------        
            if ($mode === 'v')
            {
                $id = 'session_id';
                $user_id = $this->session->userdata('session_id'); 
            }
            else
            {
                $id = 'user_id';
                $user_id = $this->session->userdata('user_id');            
            }
            
            $tables = array_keys($db_crs);
                   
            // Pobieranie danych z tabel bazy danych :
            //---------------------------------------------------------------------        
            $row_s = '';
        
            foreach($tables as $table)
            {   
                $this->db->from($table); // wybiera tabele 
                
                /** Selekcja kolumn tabeli :*/
                //--------------------------------------------------------------------- 
                if (isset($db_stat[$table]['titles']))
                    foreach ($db_stat[$table]['titles'] as $title)
                        $this->db->select($title);
                        
                /** Uwzglednienie warunkow :*/ /* where dla identyfikatora uzytkownika jest ustalany automatycznie poza warunkami w mapperze !!! */ 
                //---------------------------------------------------------------------                       
                $this->db->where($id,$user_id);                 
                if (isset($db_stat[$table]['where']))
                {
                    $wheres = array_keys($db_stat[$table]['where']);
                    foreach ($wheres as $where)
                        $this->db->where($where,$db_stat[$table]['where'][$where]);
                }
                
                /** Sortowanie rekordow :*/
                //--------------------------------------------------------------------- 
                if (isset($db_stat[$table]['orderby']))
                {
                    $orderbys = array_keys($db_stat[$table]['orderby']);
                    foreach ($orderbys as $orderby)
                        $this->db->order_by($db_stat[$table]['orderby'][$orderby],'asc');
                }
                
                /** Wynik zapytania :*/
                //--------------------------------------------------------------------- 
                $query = $this->db->get();
                $arr = $query->result_array();

                if ($query->num_rows() > 0)
                {
                    $i = -1;
                    foreach($arr as $row)
                    {       
                        $i++;                    
                    
                        $titles = $db_crs[$table]['titles'];
                        foreach ($titles as $title)
                            $row_s['dbt_'.substr($table,0,-3)][$title][$i] = $row[$title];//ucina nazwe tabeli do 3 znakow tak by mozna bylo uzywac rozne tabele w widoku                   
                    }
                }
                
                $query->free_result();       
            }  
        }
        
        return $row_s;           
    }

I teraz pytanie...
Poniewaz zdziebko mi to wyglada jak elementy mojego wlasnego ORM'u, to czy nie rozsadniej byloby (przewidujac przyszle potrzeby) zamiast umieszczac tego typu funkcje w modelu, juz w tej chwili pokusic sie o utworzenie osobnej biblioteki ?

Dziekuje z gory za odpowiedz smile

Ostatnio edytowany przez tj_gumis (24-06-2013 10:16:52)

Offline

#4 24-06-2013 12:50:40

renholder
Administrator
Data rejestracji: 06-09-2012
Liczba postów: 848

Odp: DATA MAPER ORM

Chyba umieściłbym tego rodzaju funkcje w osobnej bibliotece, szczególnie jeśli może ich być więcej w przyszłości.

Offline

#5 24-06-2013 15:13:41

tj_gumis
Użytkownik
Data rejestracji: 24-02-2013
Liczba postów: 343

Odp: DATA MAPER ORM

renholder

Bardzo Ci dziekuje.

Offline

Stopka