ไม่มีคุณสมบัติ [ชื่อ] ในอินสแตนซ์คอลเลคชันนี้


100

ต่อไปนี้ฉันกำลังวิดีโอ Laracasts: Basic รุ่น / ควบคุม / ดูขั้นตอนการทำงาน

ฉันมีตารางเก็บข้อมูลการติดต่อ

CREATE TABLE `about` (
`id` int(10) UNSIGNED NOT NULL,
`title` varchar(500) COLLATE utf8_unicode_ci NOT NULL,
`content` text COLLATE utf8_unicode_ci,
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

ฉันกำลังพยายามส่งข้อมูลเพื่อดูโดยใช้รหัสต่อไปนี้ในไฟล์คอนโทรลเลอร์:

public function index()
{
    $about = Page::where('page', 'about-me')->get(); //id = 3

    return view('about', compact('about'));
}

เมื่อฉันพยายามแสดงรหัสตามที่แสดงด้านล่าง

@section('title')
    {{$about->title}}
@stop

@section('content')
    {!! $about->content !!}
@stop

ฉันได้รับข้อผิดพลาดที่แจ้งว่า:

ไม่มีคุณสมบัติ [ชื่อ] ในอินสแตนซ์คอลเลคชันนี้ (ดู: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

แต่ถ้าฉันเปลี่ยนวิธีการดึงข้อมูลในไฟล์คอนโทรลเลอร์มันก็ใช้ได้

public function index()
{
    $about = Page::find(3);

    return view('about', compact('about'));
}

เมื่อฉันใช้dd($about)ในกรณีแรก ( where()->get()) ข้อมูลจะถูกห่อหุ้มด้วยอาร์เรย์ ในกรณีที่สอง ( find(3)) จะแสดงข้อมูลตามที่คาดไว้

ผมทำอะไรผิดหรือเปล่า?

คำตอบ:


243

เมื่อคุณกำลังใช้get()คุณจะได้รับคอลเลกชัน ในกรณีนี้คุณต้องทำซ้ำเพื่อรับคุณสมบัติ:

@foreach ($collection as $object)
    {{ $object->title }}
@endforeach

หรือคุณสามารถรับวัตถุอย่างใดอย่างหนึ่งจากดัชนีของมัน:

{{ $collection[0]->title }}

หรือรับวัตถุชิ้นแรกจากคอลเลกชัน:

{{ $collection->first() }}

เมื่อคุณใช้find()หรือfirst()คุณได้รับวัตถุดังนั้นคุณสามารถรับคุณสมบัติได้ง่ายๆ:

{{ $object->title }}

ใช่หลังจากดำเนินการ Model-> get () รับรายการที่มีวัตถุเดียวด้วยเหตุนี้จึงแสดงข้อมูลเสมอและฉันไม่สามารถเข้าถึงสิ่งนั้นได้ หลังจาก exexute ก่อน () แล้วรับวัตถุ
RubénRuíz

4
หลังจาก 4 ชั่วโมงในการค้นหาอ่านและทดสอบ Laravel Documentation และเยี่ยมชมคำถาม / คำตอบ StackOverflow จำนวนมากคุณเป็นคนเดียวที่กล่าวถึงว่า get () ดึงคอลเล็กชัน คุณเป็นคนทำให้ฉันกระโดดลงจากเก้าอี้และรู้ว่าคำถามทั้งหมดของฉันถูกต้อง ปัญหาอยู่ที่ "พิมพ์" จากก้นบึ้งของหัวใจขอขอบคุณสำหรับคำตอบนี้! ฉันหมายความตามนั้นจริงๆ!
กรินเน็กซ์

23

ด้วยget()วิธีการที่คุณได้รับคอลเลกชัน (ข้อมูลทั้งหมดที่ตรงกับข้อความค้นหา) ให้ลองใช้first()แทนโดยส่งคืนองค์ประกอบเดียวเช่นนี้:

$about = Page::where('page', 'about-me')->first();

2
$about = DB::where('page', 'about-me')->first(); 

แทน get() .

การทำงานในโครงการของฉัน ขอบคุณ.


3
แม้ว่าสิ่งนี้อาจตอบคำถามของผู้เขียน แต่ก็ไม่มีคำอธิบายและ / หรือลิงก์ไปยังเอกสารประกอบ ข้อมูลโค้ดดิบจะไม่เป็นประโยชน์หากไม่มีวลีบางอย่างรอบตัว คุณอาจพบวิธีเขียนคำตอบที่ดีซึ่งมีประโยชน์มาก โปรดแก้ไขคำตอบของคุณ - จากการตรวจสอบ
Nick

1

คุณควรใช้คีย์เวิร์ด Collection ใน Controller ชอบที่นี่..

public function ApiView(){
    return User::collection(Profile::all());
}

ที่นี่ผู้ใช้คือชื่อทรัพยากรและโปรไฟล์คือชื่อรุ่น ขอขอบคุณ.


1

บุคคลอาจได้รับสิ่งนี้ในขณะที่ทำงานกับฟังก์ชันจากโรงงานดังนั้นฉันจึงสามารถยืนยันได้ว่านี่เป็นไวยากรณ์ที่ถูกต้อง:

$user = factory(User::class, 1)->create()->first();

คุณอาจเห็นข้อผิดพลาดของอินสแตนซ์คอลเลคชันหากคุณทำสิ่งต่อไปนี้

$user = factory(User::class, 1)->create()->id;

ดังนั้นเปลี่ยนเป็น:

$user = factory(User::class, 1)->create()->first()->id;

0

$about->first()->idหรือ $stm->first()->titleและปัญหาของคุณถูกแยกออก


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