我可以在Eloquent中使用INNER JOIN而不是两个查询来查询关系吗?

时间:2013-08-13 14:41:56

标签: php orm laravel laravel-4 eloquent

我能写这样的东西:

$post = Post::join(['author'])->find($postId);
$authorName = $post->author->name;

仅生成一个具有内部联接的选择(没有2个选择)且不使用数据库查询构建器

SELECT
  post.*, 
  author.*
FROM post
  INNER JOIN author 
    ON author.id = post.author_id
WHERE post.id = ?

2 个答案:

答案 0 :(得分:3)

您可以使用join方法在Eloquent中执行此操作:

$post = Post::join('author', function($join)
    {
        $join->on('author.id', '=', 'post.author_id');
    })
    ->where('post.id', '=', $postId)
    ->select('post.*', 'author.*')
    ->first();

请注意,$post中的结果将是一个对象,其属性将与结果集相对应,如果两列具有相同的名称将合并。使用时会发生这种情况:

->select('post.*', 'author.*')

为避免这种情况,您应该在select子句中为这些列创建别名,如下所示:

->select('post.id AS post_id', 'author.id AS author_id')

答案 1 :(得分:0)

尝试

Post::join('author',function($join){
  $join->on('author.id','=','post.author_id');
})->where('post.id','=',$postId)->select('post.*','author.*');