Làm cách nào để đặt bí danh một bảng trong các truy vấn Eloquent của Laravel (hoặc sử dụng Trình tạo truy vấn)?


147

Hãy nói rằng chúng tôi đang sử dụng trình tạo truy vấn của Laravel:

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

Tôi đang tìm kiếm một tương đương với SQL này:

really_long_table_name AS short_name

Điều này sẽ đặc biệt hữu ích khi tôi phải nhập nhiều lựa chọn và địa điểm (hoặc thông thường tôi bao gồm bí danh trong bí danh cột của lựa chọn đó và nó được sử dụng trong mảng kết quả). Không có bất kỳ bí danh bảng nào, tôi sẽ gõ nhiều hơn và mọi thứ trở nên dễ đọc hơn rất nhiều. Không thể tìm thấy câu trả lời trong các tài liệu laravel, bất kỳ ý tưởng?

Câu trả lời:


217

Laravel hỗ trợ bí danh trên bảng và cột với AS. Thử

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

Hãy cùng xem nó hoạt động với một tinkercông cụ tuyệt vời

$ php nghệ nhân tinker
[1]> Schema :: tạo ('really_long_table_name', hàm ($ bảng) {$ bảng-> gia số ('id');});
// VÔ GIÁ TRỊ
[2]> DB :: bảng ('really_long_table_name') -> insert (['id' => null]);
// thật
[3]> DB :: bảng ('really_long_table_name AS t') -> select ('t.id AS uid') -> get ();
// mảng(
// 0 => đối tượng (stdClass) (
// 'uid' => '1'
//)
//)

2
@RubensMariuzzo tôi biết. Tôi tin rằng bạn có thể để lại nhận xét với yêu cầu trong diễn đàn laravel forum.laravel.io
peterm 18/07/13

2
@AldiUnanto Còn về Eloquent thì sao? Bản ghi hoạt động có nghĩa là được sử dụng trên một bảng do đó bạn không cần bí danh. Khi bạn sử dụng các mối quan hệ, bạn vẫn xử lý một bảng tại một thời điểm (nghĩa là khi bạn xác định các bộ lọc trên mối quan hệ). Bây giờ nếu bạn đang sử dụng Trình tạo truy vấn với mô hình Eloquent (nghĩa là tham gia) thì bạn có thể sử dụng bí danh trên tất cả các bảng đã tham gia, nhưng bảng mô hình.
peterm

1
@peterm nếu tôi sử dụng trình xây dựng truy vấn một cách hùng hồn thì sao? Ý tôi là mô hình hùng hồn cần khai báo một thuộc tính được bảo vệ cho tên của bảng (ví dụ protected $table = "books";) thì làm cách nào tôi có thể tạo bí danh? (ví dụ: sql được tạo ... FROM books AS A ...:)
Aldi Unanto

Bạn có thể làm protected $table = 'really_long_table_name AS short_name';nhưng điều đó không thành công trên INSERT. Cũng có thể phá vỡ các truy vấn mối quan hệ. Tôi đang sử dụng Lumen và mẫu DDD / Kho lưu trữ để tránh hoàn toàn Eloquent.
prograhammer

@peterm Mình cũng bị kẹt với bí danh Eloquent. Bạn có tìm thấy gì với Eloquent không?
Lizesh Shakya

77

Để sử dụng bí danh trên các mô hình hùng hồn sửa đổi mã của bạn như thế này:

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();

Điều này sẽ tự động thêm tiền tố bảng vào tên bảng và trả về một thể hiện của Itemsmô hình. không phải là một kết quả truy vấn trần. Việc thêm DB::rawngăn chặn laravel thêm tiền tố bảng vào bí danh.


1
@ m3rg Bạn đã bao giờ tìm thấy một cách để làm cho nó hoạt động với xóa mềm chưa? truy vấn không thành công với lỗiUnknown column 'table_alias.deleted_at'
dev7

Làm thế nào về tình huống này? CHỌN * TỪ fx_bank NHƯ MỘT QUYỀN RA NGOÀI THAM GIA fx_ex_keys NHƯ b trên b.bank_id = a.id VÀ a.agent_type = 2 WHERE b.status = 1 AND b.group = -1;
GFxJamal

@jRhesk Sử dụng DB :: raw ở mọi nơi để nhắm mục tiêu bí danh bảng. các phương pháp khác của Laravel được sử dụng như bình thường
AMIB

@ m3rg @Yani tôi sử dụng cái này ->withTrashed()->whereNull('table_alias.deleted_at')
Firman Hidayat

8

Đây là cách người ta có thể làm điều đó. Tôi sẽ đưa ra một ví dụ với việc tham gia để nó trở nên siêu rõ ràng với ai đó.

$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();

Hi vọng điêu nay co ich.


Bạn có thể cung cấp một ví dụ trong đó bí danh có khoảng trắng thay vì dấu gạch dưới (_) không?
Barkox

7

Để sử dụng trong Eloquent. Thêm vào đầu mô hình của bạn

protected $table = 'table_name as alias'

// tên_bảng phải chính xác như trong cơ sở dữ liệu của bạn

.. sử dụng trong truy vấn của bạn như

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


1
Laravel hùng hồn thiết kế rất kém, bí danh bạn xác định ở trên tốt cho truy vấn hoạt động, nhưng cập nhật và xóa sẽ lỗi vì bí danh của bạn.
Đo

1

Bạn có thể sử dụng ít mã hơn, viết này:

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

Và tất nhiên nếu bạn muốn chọn nhiều trường hơn, chỉ cần viết "," và thêm nhiều hơn:

 $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'));

Điều này rất thiết thực khi bạn sử dụng một truy vấn phức tạp


0

Giống như câu trả lời của AMIB, đối với lỗi xóa mềm "Cột không xác định 'table_alias.delatted_at'", chỉ cần thêm ->withTrashed()rồi tự xử lý như thế->whereRaw('items_alias.deleted_at IS NULL')

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.