A propriedade [título] não existe nesta instância de coleção

99

Estou acompanhando os vídeos do Laracasts: Basic Model / Controller / View Workflow .

Eu tenho uma tabela contém informações de contato.

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

Estou tentando passar dados para visualização usando o seguinte código no arquivo do controlador:

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

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

Quando tento mostrar o código conforme mostrado abaixo,

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

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

Recebo um erro que diz:

A propriedade [título] não existe nesta instância de coleção. (Visualização: E: \ laragon \ www \ newsite \ resources \ views \ about.blade.php)

Mas se eu alterar o método de recuperação no arquivo do controlador, ele funciona.

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

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

Quando eu uso dd($about)no primeiro case ( where()->get()), os dados são encapsulados por um array. No segundo caso ( find(3)), ele exibe os dados conforme o esperado.

O que estou fazendo errado?

Zkanoca
fonte

Respostas:

242

Quando você está usando, get()você obtém uma coleção . Nesse caso, você precisa iterar sobre ele para obter as propriedades:

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

Ou você pode apenas obter um dos objetos por seu índice:

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

Ou obtenha o primeiro objeto da coleção:

{{ $collection->first() }}

Quando você está usando find()ou first()obtém um objeto , pode obter propriedades com simples:

{{ $object->title }}
Alexey Mezenin
fonte
sim, após executar Model-> get () obtenho uma lista com um objeto, por isso sempre mostro dados e não consigo acessar isso. Depois de executar primeiro (), obter o objeto
Rubén Ruíz
4
Após 4 HORAS pesquisando, lendo e testando a documentação do Laravel e visitando MUITAS perguntas / respostas do StackOverflow, você foi o único que mencionou que get () recupera uma coleção. Foi você quem me fez pular da cadeira e perceber que todas as minhas dúvidas estavam corretas. O problema estava na "impressão". Do fundo do coração, muito obrigado por esta resposta! Eu realmente quero dizer isso!
Grinnex.
23

Com o get()método você obtém uma coleção (todos os dados que correspondem à consulta), tente usar em first()vez disso, ele retorna apenas um elemento, como este:

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

em vez de get() .

Funciona no meu projeto . Obrigado.

Phantih
fonte
3
Embora possa responder à pergunta do autor, faltam algumas palavras explicativas e / ou links para a documentação. Os snippets de código bruto não são muito úteis sem algumas frases em torno deles. Você também pode descobrir como escrever uma boa resposta muito útil. Por favor edite sua resposta - Do comentário
Nick
1

Você deve usar a palavra-chave Collection no Controller. Como aqui..

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

Aqui, o usuário é o nome do recurso e o perfil é o nome do modelo. Obrigado.

Pnj Patel
fonte
1

Uma pessoa pode obter isso enquanto trabalha com funções de fábrica, então posso confirmar que esta é a sintaxe válida:

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

Você pode ver o erro de instância da coleção se fizer algo como:

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

então mude para:

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

$about->first()->idou $stm->first()->titlee seu problema está resolvido.

Onyash Ed
fonte
Minha sugestão de código funciona em consertar, mas não no projeto.
Onyash Ed