Плюсы и минусы построения запросов с Active Record - PullRequest
2 голосов
/ 23 ноября 2011

У меня есть этот запрос, который я хочу выполнить в моем PHP-приложении. Условно, лист - это БД, которая отслеживает все имеющиеся у нас листы. Закупки - это БД, которая отслеживает, какие пользователи имеют доступ к какому листу. Запрос, который я хочу выполнить, получает идентификатор пользователя, я могу получить все листы, к которым он должен иметь доступ. В форме запроса:

select distinct s.wsid, s.name from sheets s, purchases p where 
s.wsid = p.wsid AND p.uid = *value*; 

где значение - это что-то, введенное приложением

На мой взгляд, есть два способа заставить это работать на заднем конце.

Вариант 1)

public function getPurchasedSheets($uid){
    if( is_numeric($uid) ){ //check against injections
        $query = "select distinct s.wsid, s.name from sheets s, purchases p 
            where s.wsid = p.wsid AND p.uid = ".$uid.";" ;
        return $this->db->query($query);
    } else {
        return NULL; //or false not quite sure how typing works in PHP
    }
}

Вариант 2)

public function getPurchasedSheets($uid){
    if( is_numeric($uid) ){ 
        $this->db->select('wsid, name'); 
        $this->db->distinct();
        $this->db->from('purchases');
        //not sure which order the join works in...
        $this->db->join('sheets', 'sheets.wsid = purchases.wsid');
        $this->db->where('uid ='.$uid);
        return $this->db->get();
    } else {
        return NULL; 
    }
}

Источник для всех команд активной записи CodeIgniter:

codeigniter.com / user_guide / базы данных / active_record.html

Есть ли какая-то разница в производительности или безопасности по сравнению с тем или иным способом? Второй способ кажется мне гораздо более запутанным ... Это немного усложняется, потому что я не уверен, как сделать двусмысленную ссылку в этом стиле кодирования, потому что покупки и листы имеют поле uid, но они означают разные вещи (в дополнение к тому, что он не очень хорошо знаком с командой объединения SQL). Uid (идентификатор пользователя) в покупках означает, что пользователь приобрел этот лист, а Uid в листах указывает, кому принадлежит этот лист.

TL, DR: В сущности, я спрашиваю, есть ли причина, по которой я должен потратить время на то, чтобы понять, как действовать в двух вариантах?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2011

Основные преимущества:

  • Абстракция от движка базы данных, где библиотека может заботиться специфичных для базы данных различий синтаксиса SQL для вас. Релевантно, если вы когда-либо иметь / хотите изменить базу данных, с которой вы работаете. Теоретически, вторая форма все еще должна работать.
  • Синтаксис «Активная запись» автоматически экранирует параметры для вас.
  • Читабельность, хотя это дело вкуса.

Кстати, если вы находитесь в среде PHP 5, библиотека поддерживает цепочку методов:

if( is_numeric($uid) ){ 
        return $this->db->select('wsid, name')
                              ->distinct()
                              ->from('purchases')
                              ->join('sheets', 'sheets.wsid = purchases.wsid')
                              ->where('uid ='.$uid)
                              ->get();
                              // nb. didn't check your join() syntax, either :)
    }

Вероятно, не по теме: Active Record CodeIgniter - это скорее построитель запросов, чем реализация Active Record. На случай, если вам интересно. Когда это рассматривается как построитель запросов, это имеет немного больше смысла;) FWIW, я люблю CodeIgniter. Я шучу от любви.

1 голос
/ 23 ноября 2011

Привязка к запросу является самой простой в реализации и выполняет те же функции, что и построение запросов, и не ограничивает вас так сильно, как вы обнаруживаете при создании.

$query = $this->db->query('SELECT something FROM table WHERE name1=? AND name2=?', array($name1, $name2);
$result = $query->result();

http://codeigniter.com/user_guide/database/queries.html

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