วิธีการเลือกคอลัมน์เฉพาะใน laravel eloquent


138

สมมติว่าฉันมี 7 คอลัมน์ในตารางและฉันต้องการเลือกเพียงสองคอลัมน์เท่านั้นอะไรทำนองนี้

SELECT `name`,`surname` FROM `table` WHERE `id` = '1';

ในรูปแบบฝีปาก laravel อาจมีลักษณะเช่นนี้

Table::where('id', 1)->get();

แต่ฉันเดาว่านิพจน์นี้จะเลือกคอลัมน์ทั้งหมดโดยที่ id เท่ากับ 1 และฉันต้องการเพียงสองคอลัมน์ (ชื่อนามสกุล) จะเลือกเพียงสองคอลัมน์ได้อย่างไร?


ขอบคุณที่ถามคำถาม มันบ้ามากที่ฉันทำสิ่งนี้อย่างถูกต้องในแบบสอบถาม SQL 'คลาสสิก' มาโดยตลอด แต่ต้องใช้ Eloquent ฉันพบว่ามันสับสนมากฉันมีความสุขที่ได้ทำงานและลืมไปว่าฉันใช้หน่วยความจำมากแค่ไหนเพราะฉัน กำลังเลือกทุกอย่าง
Jonny Perl

คำตอบ:


224

คุณสามารถทำได้ดังนี้:

Table::select('name','surname')->where('id', 1)->get();

1
สมมติว่าฉันต้องการเลือกทุกสนามคาดหวังว่าฉันจะทำเช่นนั้นได้อย่างไร
Prince Arora

2
ก่อนอื่นเมื่อคุณมีคำถามให้ถาม และสำหรับกรณีของคุณ - เพียงพูดถึงคอลัมน์ทั้งหมดแทนที่จะเป็นคอลัมน์ที่คุณไม่ต้องการรวมไว้ มันง่ายมาก
Marcin Nabiałek

2
ไม่มีวิธีอื่นใดในการทำเช่นนั้นโดยไม่กล่าวถึงคอลัมน์ทั้งหมด
Prince Arora

1
ใช้ได้กับกรณีพื้นฐานที่มีตารางเดียว อย่างไรก็ตามหากคุณใช้ความสัมพันธ์บนตาราง Pivot สิ่งนี้จะเป็นการเลือกคอลัมน์ Pivot โดยอัตโนมัติ
Benubird

1
@OPV มันแค่เรียกSELECT name, surname FROM Table where id = 1ใช้แบบสอบถาม SQL
Marcin Nabiałek

66
Table::where('id', 1)->get(['name','surname']);

ฉันต้องการสิ่งเดียวกัน แต่ใช้วิธีการที่แตกต่างกัน ฉันต้องการเลือกวิธีการโดยสร้างอินสแตนซ์ของโมเดลจากนั้นเลือกคอลัมน์ คือ $ model = MyModel ใหม่ (); $ model-> เลือก (['col1', 'col2']); แต่สิ่งนี้ไม่ทำงาน
Dhirender

49

โดยใช้วิธี all () เราสามารถเลือกคอลัมน์เฉพาะจากตารางดังที่แสดงด้านล่าง

ModelName::all('column1', 'column2', 'column3');

หมายเหตุ : Laravel 5.4


ฉันต้องการสิ่งเดียวกัน แต่ใช้วิธีการที่แตกต่างกัน ฉันต้องการเลือกวิธีการโดยสร้างอินสแตนซ์ของโมเดลจากนั้นเลือกคอลัมน์ คือ $ model = MyModel ใหม่ (); $ model-> เลือก (['col1', 'col2']); แต่สิ่งนี้ไม่ทำงาน
Dhirender

37

คุณยังสามารถใช้find()สิ่งนี้:

ModelName::find($id, ['name', 'surname']);

$idตัวแปรสามารถเป็นอาร์เรย์ในกรณีที่คุณต้องการที่จะดึงกรณีหลายรูปแบบ



17

ก่อนอื่นคุณต้องสร้าง Model ซึ่งแสดงถึงตารางนั้นจากนั้นใช้วิธี Eloquent ด้านล่างเพื่อดึงข้อมูลจาก 2 ฟิลด์เท่านั้น

Model::where('id', 1)
         ->pluck('name', 'surname')
         ->all();

นี่เป็นคำตอบที่ดีที่สุดเนื่องจากใช้งานได้กับตาราง Pivot ในหลาย ๆ ความสัมพันธ์
Luciano Fantuzzi


4

นอกจากนี้คุณสามารถใช้ถอนขน

Model::where('id',1)->pluck('column1', 'column2');

6
โปรดทราบว่าpluck()มีประสิทธิภาพน้อยกว่าวิธีการอื่น ๆ ที่กล่าวถึงเนื่องจากไม่ได้ปรับเปลี่ยนSELECT ...แบบสอบถาม แต่จะดำเนินการกับชุดผลลัพธ์ที่ส่งคืนแล้ว
Ben Johnson

4

รับค่าหนึ่งคอลัมน์:

Table_Name::find($id)->column_name;

คุณสามารถใช้วิธีนี้กับ where clause:

Table_Name::where('id',$id)->first()->column_name;

ในตัวสร้างแบบสอบถาม:

DB::table('table_names')->find($id)->column_name;

กับที่ไหน cluase:

DB::table('table_names')->where('id',$id)->first()->column_name;

หรือ

DB::table('table_names')->where('id',$id)->first('column_name');

ผลลัพธ์ของวิธีสุดท้ายคืออาร์เรย์


3

คุณสามารถใช้Table::select ('name', 'surname')->where ('id', 1)->get ().

โปรดทราบว่าเมื่อเลือกเฉพาะบางฟิลด์คุณจะต้องทำการสอบถามอีกครั้งหากคุณเข้าถึงฟิลด์อื่น ๆ เหล่านั้นในคำขอในภายหลัง (ซึ่งอาจชัดเจนเพียงแค่ต้องการรวมข้อแม้นั้น) การรวมฟิลด์ id เป็นความคิดที่ดีเพื่อให้ laravel รู้วิธีเขียนการอัปเดตที่คุณทำกับอินสแตนซ์ของโมเดล


3

จาก laravel 5.3 โดยใช้get()วิธีการเท่านั้นคุณจะได้รับคอลัมน์เฉพาะของตารางของคุณ:

YouModelName::get(['id', 'name']);

หรือจาก laravel 5.4 คุณยังสามารถใช้all()วิธีการรับฟิลด์ที่คุณเลือก:

YourModelName::all('id', 'name');

ด้วยทั้งสองวิธีข้างต้นget()หรือall()คุณสามารถใช้where()แต่ไวยากรณ์แตกต่างกันสำหรับทั้งสองอย่าง:

รุ่น :: ทั้งหมด ()

YourModelName::all('id', 'name')->where('id',1);

รุ่น :: รับ ()

YourModelName::where('id',1)->get(['id', 'name']);

3

เพื่อให้ได้ผลลัพธ์ของคอลัมน์เฉพาะจากตารางเราต้องระบุชื่อคอลัมน์

ใช้รหัสต่อไปนี้: -

   $result = DB::Table('table_name')->select('column1','column2')->where('id',1)->get();  

ตัวอย่างเช่น -

$result = DB::Table('Student')->select('subject','class')->where('id',1)->get();  

โปรดเพิ่มคำอธิบายให้กับคำตอบของคุณเพื่อให้คนอื่นสามารถเรียนรู้ได้
Nico Haase

2

แม้ว่าวิธีการทั่วไปส่วนใหญ่จะใช้Model::selectแต่ก็สามารถทำให้เกิดการแสดงผลแอตทริบิวต์ทั้งหมดที่กำหนดด้วยวิธีการเข้าถึงภายในคลาสโมเดล ดังนั้นหากคุณกำหนดแอตทริบิวต์ในโมเดลของคุณ:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get the user's first name.
     *
     * @param  string  $value
     * @return string
     */
    public function getFirstNameAttribute($value)
    {
        return ucfirst($value);
    }
}

จากนั้นใช้: TableName::select('username')->where('id', 1)->get();

มันจะส่งออกคอลเลกชันที่มีทั้งfirst_nameและusernameแทนที่จะเป็นชื่อผู้ใช้เท่านั้น

ใช้งานpluck()เดี่ยวได้ดีกว่าหรือใช้ร่วมกับselect- หากคุณต้องการคอลัมน์เฉพาะ

TableName::select('username')->where('id', 1)->pluck('username');

หรือ

TableName::where('id', 1)->pluck('username'); // ซึ่งจะส่งคืนคอลเล็กชันที่ประกอบด้วยusernameค่าเท่านั้น

นอกจากนี้คุณสามารถเลือกใช้->toArray()เพื่อแปลงวัตถุคอลเลกชันเป็นอาร์เรย์


1

->get()เหมือนมาก->all()(และ->first()อื่น ๆ .. ) สามารถใช้ฟิลด์ที่คุณต้องการนำกลับมาเป็นพารามิเตอร์

->get/all(['column1','column2'])

จะนำกลับมาสะสม แต่เฉพาะกับcolumn1และcolumn2


1

คุณยังสามารถใช้findOrFail()วิธีการที่นี่ได้อีกด้วย

หากไม่พบข้อยกเว้นการตอบสนอง HTTP 404 จะถูกส่งกลับไปยังผู้ใช้โดยอัตโนมัติ ไม่จำเป็นต้องเขียนการตรวจสอบอย่างชัดเจนเพื่อส่งคืนการตอบกลับ 404 เมื่อใช้วิธีการเหล่านี้อย่าให้เกิดข้อผิดพลาด 500 ..

ModelName::findOrFail($id, ['firstName', 'lastName']);

1

ถ้าคุณต้องการรับแถวเดียวและจากแถวนั้นคอลัมน์เดียวให้ใช้โค้ดหนึ่งบรรทัดเพื่อรับค่าของคอลัมน์เฉพาะ find()วิธีการควบคู่ไปกับการระบุคอลัมน์ที่คุณต้องการดึงข้อมูล

นี่คือโค้ดตัวอย่าง:

ModelName::find($id_of_the_record, ['column_name'])->toArray()['column_name'];

0

คุณสามารถใช้แบบสอบถามด้านล่าง:

Table('table')->select('name','surname')->where('id',1)->get();

1
โปรดเพิ่มคำอธิบายให้กับคำตอบของคุณเพื่อให้คนอื่นสามารถเรียนรู้ได้
Nico Haase

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.