Laravel Eloquent 쿼리에서 테이블 별칭을 지정하는 방법 (또는 Query Builder 사용)은 무엇입니까?


147

라 라벨의 쿼리 빌더를 사용한다고 가정 해 봅시다 :

$users = DB::table('really_long_table_name')
           ->select('really_long_table_name.id')
           ->get();

이 SQL과 동등한 것을 찾고 있습니다.

really_long_table_name AS short_name

이것은 많은 선택과 위치를 입력해야 할 때 특히 유용합니다 (또는 일반적으로 선택의 열 별칭에도 별칭을 포함시키고 결과 배열에 사용됩니다). 테이블 별칭이 없으면 나를 위해 더 많은 타이핑이 있으며 모든 것이 훨씬 덜 읽기 쉽습니다. 라 라벨 문서, 어떤 아이디어에서도 답을 찾을 수 없습니까?

답변:


218

Laravel은로 테이블 및 열에서 별칭을 지원합니다 AS. 시험

$users = DB::table('really_long_table_name AS t')
           ->select('t.id AS uid')
           ->get();

멋진 tinker도구 로 실제 동작을 보자

$ PHP 장인 땜장이
[1]> 스키마 :: create ( 'really_long_table_name', function ($ table) {$ table-> increments ( 'id');});
// 없는
[2]> DB :: table ( 'really_long_table_name')-> insert ([ 'id'=> null]);
// 진실
[3]> DB :: table ( 'really_long_table_name AS t')-> select ( 't.id AS uid')-> get ();
// 배열 (
// 0 => 객체 (stdClass) (
// 'uid'=> '1'
//)
//)

2
@RubensMariuzzo 알고 있습니다. 난 당신이 laravel 포럼의 요청에 코멘트를 남길 수 있습니다 생각은 forums.laravel.io
peterm는

2
@AldiUnanto Eloquent는 어떻습니까? 하나의 테이블에서 사용되는 활성 레코드이므로 별칭이 필요하지 않습니다. 관계를 사용할 때 여전히 한 번에 하나의 테이블을 처리합니다 (예 : 관계에 대한 필터를 정의 할 때). 이제 Eloquent 모델 (예 : 조인)과 함께 Query Builder를 사용하는 경우 조인 된 모든 테이블과 모델 테이블에서 별명을 사용할 수 있습니다.
피터

1
@peterm 웅변에서 쿼리 빌더를 사용하면 어떻게됩니까? 설득력있는 모델이 테이블 이름 (예 :)에 대해 보호 된 속성을 선언해야하는 protected $table = "books";경우 별칭을 어떻게 만들 수 있습니까? (예를 들어 생성 된 SQL : ... FROM books AS A ...)
ALDI Unanto

당신은 할 수는 protected $table = 'really_long_table_name AS short_name';있지만 INSERT에서는 실패합니다. 또한 관계 쿼리가 중단 될 수 있습니다. Eloquent를 완전히 피하기 위해 Lumen과 DDD / Repository 패턴을 사용하고 있습니다.
prograhammer

@ peterm 나는 또한 Eloquent 별칭으로 붙어 있습니다. Eloquent에서 찾은 것이 있습니까?
Lizesh Shakya

77

웅변 모델에서 별칭을 사용하려면 다음과 같이 코드를 수정하십시오.

Item
    ::from( 'items as items_alias' )
    ->join( 'attachments as att', DB::raw( 'att.item_id' ), '=', DB::raw( 'items_alias.id' ) )
    ->select( DB::raw( 'items_alias.*' ) )
    ->get();

그러면 테이블 이름에 테이블 접두사가 자동으로 추가되고 Items모델 인스턴스가 반환 됩니다. 베어 쿼리 결과가 아닙니다. 추가 DB::raw하면 laravel이 별칭에 테이블 접두사를 추가 하지 못합니다.


1
@ m3rg 소프트 삭제로 작동시키는 방법을 찾은 적이 있습니까? 쿼리 오류Unknown column 'table_alias.deleted_at'
dev7

이 상황은 어떻습니까? b.bank_id = a.id 및 a.agent_type = 2에서 b.status = 1이고 b.group = -1 인 fx_bank에서 오른쪽 외부 조인으로 fx_ex_keys AS를 선택하십시오.
GFxJamal

@jRhesk DB :: raw를 사용하여 테이블 별칭을 대상으로합니다. 다른 라 라벨 방법은 정상적으로 사용됩니다
AMIB

@ m3rg @Yani 나는 이것을 사용 ->withTrashed()하고->whereNull('table_alias.deleted_at')
Firman Hidayat

8

어떻게 할 수 있습니까? 나는 누군가에게 분명해 지도록 가입하는 예를 보여줄 것이다.

$products = DB::table('products AS pr')
        ->leftJoin('product_families AS pf', 'pf.id', '=', 'pr.product_family_id')
        ->select('pr.id as id', 'pf.name as product_family_name', 'pf.id as product_family_id')
        ->orderBy('pr.id', 'desc')
        ->get();

도움이 되었기를 바랍니다.


별칭에 밑줄 (_) 대신 공백이있는 예를 제공 할 수 있습니까?
Channox

7

Eloquent에서 사용합니다. 모델 위에 추가

protected $table = 'table_name as alias'

// table_name은 데이터베이스와 동일해야합니다.

.. 그런 다음 쿼리에서 사용하십시오.

ModelName::query()->select(alias.id, alias.name)


1
Laravel은 매우 열악한 디자인, 별칭을 사용하여 작업 쿼리에 대해 위에서 정의했지만 별칭 및 별칭 때문에 업데이트 및 삭제 오류가 발생합니다.
Meas

1

더 적은 코드를 사용하여 다음을 작성할 수 있습니다.

    $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name'));

물론 더 많은 필드를 선택하려면 ""를 작성하고 더 추가하십시오.

 $users = DB::table('really_long_table_name')
       ->get(array('really_long_table_name.field_very_long_name as short_name', 'really_long_table_name.another_field as other', 'and_another'));

복잡한 조인 쿼리를 사용할 때 매우 실용적입니다.


0

AMIB 답변과 동일합니다. 소프트 삭제 오류 "알 수없는 열 'table_alias.deleted_at'"에 대해 추가 ->withTrashed()한 다음 직접 처리하십시오.->whereRaw('items_alias.deleted_at IS NULL')

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.