Laravel eloquent 모델로 3 개의 테이블을 결합하는 방법


85

테이블이 세 개 있어요

기사 테이블

 id
 title
 body
 categories_id
 user_id

카테고리 테이블

  id
  category_name

사용자 테이블

 id
 user_name
 user_type

category_id 대신 카테고리 이름으로 기사를 표시하고 user_id 대신 user_name으로 기사를 표시하고 싶습니다.이 쿼리처럼 시도해 보았습니다.

$articles =DB::table('articles')
                ->join('categories', 'articles.id', '=', 'categories.id')
                ->join('users', 'users.id', '=', 'articles.user_id')
                ->select('articles.id','articles.title','articles.body','users.username', 'category.name')
                ->get();

그러나 나는 Eloquent 방식으로하고 싶습니다. 제발, 어떻게해야합니까?


1
이러한 테이블을 조인하는 뷰를 생성 한 다음 그 테이블에서 읽는 Eloquent 모델을 생성하는 것은 어떻습니까? 코드 복잡성이 줄어들고 수익이 발생하며 힘든 작업이 필요하지 않습니다.
NB

1
다른 모든 관련 모델 및 기능은 Eloquent Model과 함께 작동합니다. 그래서 나는 Eloquent Way를 사용해야합니다.
Nay

1
여기에서 착각 ->join('categories', 'articles.id', '=', 'categories.id')했습니까? 대신 articles.id이 있어야한다 articles.categories_id. 아니면 내가 틀렸나 요?
FreeLightman 2015

답변:


140

Eloquent를 사용하면 관계형 데이터를 매우 쉽게 검색 할 수 있습니다. Laravel 5의 시나리오로 다음 예제를 확인하십시오.

세 가지 모델이 있습니다.

1) 기사 (사용자 및 카테고리에 속)

2) 카테고리 (기사가 많음)

3) 사용자 (문서가 많음)


1) Article.php

<?php

namespace App\Models;
 use Eloquent;

class Article extends Eloquent{

    protected $table = 'articles';

    public function user()
    {
        return $this->belongsTo('App\Models\User');
    }

    public function category()
    {
        return $this->belongsTo('App\Models\Category');
    }

}

2) Category.php

<?php

namespace App\Models;

use Eloquent;

class Category extends Eloquent
{
    protected $table = "categories";

    public function articles()
    {
        return $this->hasMany('App\Models\Article');
    }

}

3) User.php

<?php

namespace App\Models;
use Eloquent;

class User extends Eloquent
{
    protected $table = 'users';

    public function articles()
    {
        return $this->hasMany('App\Models\Article');
    }

}

모델에서 데이터베이스 관계 및 설정을 이해해야합니다. 사용자는 많은 기사를 가지고 있습니다. 카테고리에는 많은 기사가 있습니다. 기사는 사용자 및 카테고리에 속합니다. Laravel에서 관계를 설정하면 관련 정보를 쉽게 검색 할 수 있습니다.

예를 들어, 사용자 및 카테고리를 사용하여 기사를 검색하려면 다음을 작성해야합니다.

$article = \App\Models\Article::with(['user','category'])->first();

다음과 같이 사용할 수 있습니다.

//retrieve user name 
$article->user->user_name  

//retrieve category name 
$article->category->category_name

다른 경우에는 카테고리 내의 모든 기사를 검색하거나 특정 사용자의 기사를 모두 검색해야 할 수 있습니다. 다음과 같이 작성할 수 있습니다.

$categories = \App\Models\Category::with('articles')->get();

$users = \App\Models\Category::with('users')->get();

http://laravel.com/docs/5.0/eloquent 에서 자세히 알아볼 수 있습니다.


답장을 보내 주셔서 감사합니다.하지만 laravel 4를 사용하고 json 형식으로 데이터를 반환하고 싶습니다 return Response::json( array( 'total_count' => $count, 'incomplete_results' => false, 'items'=> $articles->toArray() ));.
Nay

모든 코드가 Laravel 4에서 작동하더라도 네임 스페이스를 제거하기 만하면됩니다. $ articles-> toArray ()는 동일하게 작동합니다. 시도해주세요
Anand Patel 2015 년

형제 님 감사합니다. 그것은 일이고 당신은 내 생명을 구합니다 :). 늦게 답장을 드려 죄송합니다. 어제 컴퓨터 근처에 있지 않았기 때문입니다.
Nay

4
확실하지 않지만이 방법 (유창한 사용)이 3 개의 쿼리를 생성하는 것 같습니다. custom의 쿼리 join는 단일입니다. 따라서 아래 @NayZawOo의 답변이 더 수용 가능합니다.
FreeLightman

$ article-> category-> category_name과 같이 액세스하고 싶지 않지만 $ article-> categoryName과 같은 별칭을 사용하는 경우 어떻게 웅변적인 쿼리를 작성합니까?
Herokiller

23

시험:

$articles = DB::table('articles')
            ->select('articles.id as articles_id', ..... )
            ->join('categories', 'articles.categories_id', '=', 'categories.id')
            ->join('users', 'articles.user_id', '=', 'user.id')

            ->get();

json 객체 형식 반환을 원합니다. $ articles-> count () 및 $ articles-> offset ($ offset); $ articles-> get (array ( 'id', 'title', 'body')); 그러나 당신의 방식은 이러한 개체 기능을 적용 할 수 없습니다. 귀하의 지원에 감사드립니다.
Nay

1
반환 응답 : json ($ articles);
Nay Zaw Oo

이것이 설득력있는 방법은 아니지만 외부 테이블의 필드를 기준으로 정렬하는 경우 유일한 방법입니다. (권장하지는 않지만 때때로 필요합니다). 그렇기 때문에 나는 이것이 여전히 매우 유효한 대답이라고 생각합니다. (이 질문은 테이블 을 조인 하는 방법을 물었고 , 설득력있는 방법은 실제로 원래 쿼리에서 테이블 을 조인 하지 않습니다.)
Skeets

이 패키지는 당신이 도움이 CAL github.com/fico7489/laravel-eloquent-join
fico7489

"이것이 설득력있는 방법은 아니지만 외국 테이블의 필드별로 정렬하는 경우 유일한 방법입니다."Skeets, 유일한 방법이라고 말하면 laravel 문서가이 중요한 정보를 생략한다고 말하는 것입니까?
Glen

3
$articles =DB::table('articles')
                ->join('categories','articles.id', '=', 'categories.id')
                ->join('user', 'articles.user_id', '=', 'user.id')
                ->select('articles.id','articles.title','articles.body','user.user_name', 'categories.category_name')
                ->get();
return view('myarticlesview',['articles'=>$articles]);

위 쿼리는이 답변에 해결되었다 무결성 제약 조건 위반 오류가 있습니다
하기 Akshay 쉬얍
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.