2013-07-19 1 views
13

Возможно, из-за моего фона Codeigniter, я просто не нахожу, что я наслаждаюсь Larvel 4's Eloquent ORM. Скажем, я хотел бы написать запрос, который упорядочивает список сообщений по id, по убыванию, как может Eloquent избить ясность DB::table('posts')->orderBy('id', 'desc')->get();?Когда использовать «Красноречивый» (ORM) над Fluent (Query Builder)?

Есть ли веская причина для использования Eloquent over Fluent, было ли это главным образом для соединения столов?

ответ

29

Я тоже пришел из codeigniter, и это мой опыт: Я использую Eloquent и Fluent обычно вместе. Eloquent - это то, что позволяет вам хорошо работать с отношениями, CRUD-операциями и т. Д. Когда вам нужно выполнять некоторые операции SQL, вы можете легко добавить некоторые текущие функции.

В приведенном выше примере я вижу, что у вас есть стол сообщений. Если у вас есть пост модель, то же самое написано с использованием Красноречивым является:

Post::orderBy('id', 'desc')->get(); 

Так как я понимаю, если вы распространяетесь красноречивее

Model_name::some_functions 

таким же, как

DB::table('table_name')->some_functions 

Реальная власть возникает, когда вам нужно создать или обновить модель или, например, получить комментарии к сообщению. Чем это становится легко:

$comments = Post::find($id)->comments; 

Таким образом, ответ - вам нужно свободно использовать функции, чтобы получить упорядоченный список. Вы можете использовать их как с DB :: table ('posts') -> orderBy или Post :: orderBy

+0

ТНХ, просто чтобы подтвердить, для 'Post :: найти ($ ID) -> комментарии;' 'comments' метод, это должно работать против' Post' стола , или это может быть соединение между таблицей 'Post' и' Comment'? – bitinn

+0

Не уверен, что я понимаю. У вас есть столбец и комментарии, у вас есть post_id в таблице комментариев, и вы описываете метод в post-классе (функция comments() {return $ this-> hasMany ('comment');}. А также у вас есть класс Comment. вы можете использовать Post :: find ($ id) -> комментарии, которые присоединятся к вашей записи с комментариями (например, selet * from posts добавить комментарии к comments.post_id = posts.id) – Victor

+0

В качестве разъяснения Красноречивый наследует от Fluent, так что в основном все, что вы Если вы делаете 'Post :: find ($ id) -> comments', вы не выполняете объединение по умолчанию, а сначала' SELECT * FROM posts WHERE id = $ id' и после этого 'SELECT * FROM comments WHERE post_id = $ id', но только при вызове/запросе' -> comments'. Если вы хотите загрузить все отношения одновременно, проверьте [Eloquent's Eager Загрузка] (http://laravel.com/docs/eloquent#eager-loading). – trm42

3

Используя модели и Eloquent, вы также можете написать пользовательские функции в классе модели для выполнения общих операций, например, выводя пару конкатенированных полей.

, например:

<?php 
class User extends Eloquent { 
    //Standard Relation Function 
    public function posts() { 
     return $this->hasMany('Post'); 
    } 
    //Custom function 
    public function fullname() { 
     return $this->firstName.' '.$this->lastName; 
    } 
} 

//Somewhere else in your code, if you need a users full name... 
$user = User::find(3); 
$name = $user->fullname(); 
+7

Мы можем сделать это еще дальше с помощью функций getXAttribute(). Например: getFullNameAttribute(), тогда мы можем просто сделать $ user-> fullName. – euantorano

+0

@euantorano Действительно, хороший момент! –