2014-10-14 4 views
0

Мне нужно немного разъяснений.Попытка получить собственность не-объекта

Это сообщение об ошибке «Попытка получить свойство не-объекта» относится к тому, что упоминается при использовании Eloquent? Я схожу с ума. Я пользуюсь какой-либо функцией:

public function squadra_post() 
{ 
return $this->hasMany('Squadra','id_squadra'); 
} 

Это модель, которая расширяет Eloquent Post. Когда звонок:

<?php $squadra = Post::find($roles->id_squadra)->squadra_post; ?> 

дает мне ошибку, о которой я упоминал ранее.

EDIT

его класс пост со своими методами. Что нужно задавать, так это «squadra_post()« Мне нужно извлечь имя команды по содержимому сообщения id_squadra в таблице.

class Post extends Eloquent implements UserInterface, RemindableInterface 
{ 
    protected $table = 'post'; 
    protected $primaryKey = 'id_post'; 
    public $timestamps = false; 

    public function commenti() 
    { 
     return $this->hasMany('Commento','id_post'); 
    } 

    public function apprezzamenti() 
    { 
     return $this->hasMany('Apprezzamenti','id_post'); 
    } 

    public function squadra_post() 
    { 
     return $this->hasMany('Squadra','id_squadra'); 
    } 
} 

Это код класса «Скуадры»

class Squadra extends Eloquent implements UserInterface, RemindableInterface 
{ 
    protected $table = 'squadra'; 
    protected $primaryKey = 'id_squadra'; 
    public $timestamps = false; 
} 

И, наконец, это код, который дает мне проблемы. Это то, что дает мне ошибку: Попытка получить свойство необъектных

@foreach($post['post'] as $roles) 
    @if($roles->id_squadra != 0) 
     $squadra = Post::find($roles->id_squadra)->squadra_post; 
     @foreach($squadra as $squadra_post) 
      {{ $squadra->nome }} 
     @endforeach 
    @endif 
@endforeach 

ответ

0

В строке

$squadra = Post::find($roles->id_squadra)->squadra_post; 

squadra_post() метод

возвращает коллекцию объектов (сообщения, я думаю) а не объект из-за характера ваших отношений (от 1 до многих), в то время как Post::find() возвращает объект. Я думаю, что здесь происходит ошибка.

попробуйте следующий код

$squadra = Post::find($roles->id_squadra); 

if ($squadra) { 
    echo $squadra->name; 

    foreach ($squadra->squadra_post as $post) { 
     echo $post->title; 
     echo $post->content; //etc 
    } 
} 

EDIT

Также вы должны быть уверены в том, что внешний ключ является id_squadra, что вы объявите в вашем методе squadra_post().

+0

Я уже пробовал, но у меня всегда такая же ошибка. То, что я не понимаю, это то, что я использую аналогичный код с «похожими» и комментариями, и все в порядке. – Francesco

+0

Вы уверены, что $ role-> id_squadra возвращает один id, а не несколько? – geoandri

+0

Это дает мне эту ошибку: Недействительный аргумент для Еогеаспа() – Francesco

0

Когда вы устали пытаться найти конкретный пост, он не смог его найти и, следовательно, он выбрал исключение, говорящее «Попытка получить свойство не-объекта». Если бы он нашел сообщение, он вернул бы squadra_post, и он был бы сохранен в переменной.

Но вместо этого он не смог найти этот конкретный объект и не мог построить с ним объект, и поэтому он не смог найти это конкретное имя свойства squadra_post. Поэтому ошибка «Попытка получить свойство не-объекта».

Вы можете обработать это исключение, поставив код в блок try и catch.

0

Во-первых, ваше отношение не будет работать таким образом, becuase Laravel 4+ ожидает имен отношений быть camelCased и только тогда вы можете использовать dynamic properties.

Так переименовать его в squadraPost() и называть как $post->squadraPost, а в случае hasMany вы получите Collection здесь, независимо от того, есть ли связанная модель или нет.

Следующая вещь проверки, если связанная модель существует - для этого прочитать ответ здесь: Laravel check if related model exists

И последнее, но не менее важный: вы можете получить null от find() метода, поэтому сначала убедитесь, что это:

$post = Post::find(..) 

возвращает вашу модель, не null. Только тогда вы можете назвать его отношение:

if ($post) $post->squadraPost; 
Смежные вопросы