Laravel Eloquent在Join Table上

时间:2016-02-18 10:12:20

标签: php mysql laravel-5 eloquent laravel-5.1

我在laravel 5中有两个实体Eloquent,Foo和FooType与oneToMany关系。

class Foo {

   public function fooTypes(){
    return $this->hasMany('App\FooType');
   }
}

和FooType

class FooType{

   public function foo(){
     return $this->belongsTo('App\Foo');
   }
}

问题1: 如何使用eloquent查询构建器进行查询并返回具有type_id(此列在FooType表中)为5的Foos;

我试过的东西:

Foo::fooTypes()->where('type_id', 5);

以及任何有关此类查询的良好关键链接。

问题二: 我发现这很难用Eloquent查询构建器将normal laravel queries与DB一起使用是不好的做法,我的意思是使用db我不能使用orm或类似的东西(或者使用eloquent查询构建器有什么好处) :

$foos = DB::table('foos')
        ->join('fooTypes', 'foo_id', '=', 'foos.id')
        ->where('fooTypes.type_id', '=', '5')
        ->select('foos.*')
        ->get();

这种类型的查询非常简单,并且有更多关于它的教程。

1 个答案:

答案 0 :(得分:9)

回答问题1:
在你的情况下使用eloquent orm时可以使用advance where子句,使用可以尝试:

Foo::whereHas('fooTypes', function($query){
    $query->whereTypeId(5);  
})->get();  

回答问题2:

Data Mapper或Query构建器比ORM Active Record更快。因此,当您编写具有大量并发请求的非常大的应用程序时,Data Mapper / Query Builder就是您的选择。

另一方面,ORM为刚开始使用Laravel或正在编写中小型应用程序的用户提供了更清晰的语法和更好的代码可读性,其中并发请求的数量不会很大。

查询构建器语法更接近普通SQL查询,任何使用过数据库和SQL的人都很容易找到它们。
因此,您必须根据“查询”构建器语法以及您正在编写的应用程序大小来确定它的选择。

Laravel Eloquent vs Fluent query builder