Thuộc tính [title] không tồn tại trên phiên bản bộ sưu tập này


95

Tôi đang theo dõi các video của Laracasts: Mô hình cơ bản / Bộ điều khiển / Xem quy trình làm việc .

Tôi có một bảng chứa thông tin liên hệ.

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

Tôi đang cố chuyển dữ liệu để xem bằng mã sau trong tệp bộ điều khiển:

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

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

Khi tôi cố gắng hiển thị mã như hình dưới đây,

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

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

Tôi gặp lỗi cho biết:

Thuộc tính [title] không tồn tại trên phiên bản bộ sưu tập này. (Xem: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Nhưng nếu tôi thay đổi phương thức truy xuất trong tệp bộ điều khiển, nó sẽ hoạt động.

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

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

Khi tôi sử dụng dd($about)trong trường hợp đầu tiên ( where()->get()), dữ liệu được đóng gói bởi một mảng. Trong trường hợp thứ hai ( find(3)), nó hiển thị dữ liệu như mong đợi.

Tôi đang làm gì sai?

Câu trả lời:


235

Khi bạn đang sử dụng, get()bạn sẽ nhận được một bộ sưu tập . Trong trường hợp này, bạn cần phải lặp lại nó để nhận các thuộc tính:

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

Hoặc bạn có thể chỉ lấy một trong các đối tượng bằng chỉ mục của nó:

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

Hoặc lấy đối tượng đầu tiên từ bộ sưu tập:

{{ $collection->first() }}

Khi bạn đang sử dụng find()hoặc first()bạn nhận được một đối tượng , vì vậy bạn có thể nhận các thuộc tính bằng cách đơn giản:

{{ $object->title }}

vâng, sau khi thực thi Model-> get () lấy một danh sách với một đối tượng, vì lý do đó luôn hiển thị dữ liệu và tôi không thể truy cập vào đó. Sau exexute đầu tiên () sau đó nhận được đối tượng
Rubén Ruíz

2
Sau 4 GIỜ tìm kiếm, đọc và kiểm tra Tài liệu Laravel cũng như truy cập RẤT NHIỀU câu hỏi / câu trả lời của StackOverflow, bạn là người duy nhất đề cập rằng get () truy xuất một bộ sưu tập. Chính bạn đã khiến tôi nhảy khỏi ghế và nhận ra rằng tất cả những truy vấn của tôi đều đúng. Vấn đề là ở "bản in". Từ tận đáy lòng của tôi, rất cảm ơn bạn vì câu trả lời này! Tôi thực sự có ý đó!
Grinnex.

22

Với get()phương thức bạn nhận được một tập hợp (tất cả dữ liệu phù hợp với truy vấn), hãy thử sử dụng first()thay thế, nó chỉ trả về một phần tử, như thế này:

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

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

thay vì get() .

Nó hoạt động trên dự án của tôi . Cảm ơn.


3
Mặc dù điều này có thể trả lời câu hỏi của các tác giả, nhưng nó thiếu một số từ giải thích và / hoặc liên kết đến tài liệu. Các đoạn mã thô không hữu ích lắm nếu không có một số cụm từ xung quanh chúng. Bạn cũng có thể thấy cách viết một câu trả lời hay rất hữu ích. Vui lòng chỉnh sửa câu trả lời của bạn - Từ Đánh giá
Nick

1

Bạn nên sử dụng từ khóa Collection trong Controller. Như Đây ..

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

Ở đây, Người dùng là Tên Tài nguyên và Hồ sơ là Tên Mẫu. Cảm ơn bạn.


1

Một người có thể nhận được điều này khi làm việc với các chức năng của nhà máy, vì vậy tôi có thể xác nhận đây là cú pháp hợp lệ:

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

Bạn có thể gặp lỗi phiên bản bộ sưu tập nếu bạn làm điều gì đó như:

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

vì vậy hãy thay đổi nó thành:

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

0

$about->first()->idhoặc $stm->first()->titlevà vấn đề của bạn đã được giải quyết.


Đề xuất mã của tôi hoạt động trên tinker nhưng không hoạt động trên dự án.
Onyash Ed
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.