2016-08-12 143 views
1

我通常会创建一个Repository目录来存储我的控制器的所有查询。我的问题是,哪个更好用一个雄辩的模型或db :: facade?Laravel 5.2 Eloquent

通常在我的项目,我同时使用,但有时它看起来凌乱:

public function getUsersLanguagues($user_id) 
    { 
     $query = DB::table('languages as l') 
      ->select('l.name') 
      ->leftJoin('language_user as lu', 'l.id', '=', 'lu.language_id') 
      ->where('lu.user_id', $user_id) 
      ->get(); 

     return $query; 
    } 

    public function getUsersLanguagues($user_id) 
    { 
     return Languages::select('languages.name') 
      ->leftJoin('language_user as lu', 'languagues.id', '=', 'lu.language_id') 
      ->where('lu.user_id', $user_id) 
      ->get(); 
    } 

我知道他们都带回不同种类的对象,集合,等...但我想知道这是最好的一个使用,或推荐的方式来使用。提前致谢。

+0

但是在任何一个例子中,你都没有真正使用过雄辩,至少不是你试图让它们看起来不同。无论如何,您只是使用该模型,然后将查询构建器应用到其实例的返回。 – Ohgodwhy

+1

我认为他需要比较雄辩vs查询构建器。在我看来,Eloquent ORM给了你很多“魔力”,但是当有复杂的查询时,例如全文搜索查询,那么你将需要为你自己建立一个查询。而且,对于这方面的表现,可读性......还有一些比较,你应该看看它们。 – haitran

回答

1

在提供的示例中没有看到有显着差异。最后,你只需要使用Database's Query BuilderEloquent's Query Builder这些共享很多特征。实际上,Eloquent在其许多方法中注入了数据库的查询生成器。

Laravel 5.2 official documentation

每个洋洋洒洒模型作为一个强大的查询生成器,让您流畅查询与模型相关联的数据库表的思考。


我认为它们之间的最significants的区别之一,就是你可以用雄辩带来从关系数据的方式:

# An example adapted to your needs 
LanguagesUsers::where('user_id', $user_id)->first()->languages 

同样可以通过这种方式来实现,如果你喜欢:

# languages_users is the name you may give to your relation in your model 
Languages::whereHas('languages_users', function ($query) { 
    $query->where('user_id', $user_id); 
})->get(); 

所以,至少从我的角度来看,Eloquent比加入更具有表达性。

这只是我看到的更重要的差异,但有很多好的东西Eloquent提供了比较简单的数据库的查询生成器。为此,我建议你尽可能地使用雄辩。


作为最后的评论,发现自laravel 5.3,数据库的Query Builder will return collections,同样与口才。所以这不会再有区别了。

+0

感谢您的回复,在laravel 5.3上不知道,查询生成器返回集合,肯定会迁移,再次感谢。 – Carlos