2016-08-30 4 views
-2

Итак, я пытаюсь изучить laravel, и я как бы застрял в отношениях друг с другом. Итак, у меня есть страница с 3-мя ссылками на нее и вход в db щелчок по этим ссылкам. Все хорошо, я нажимаю ссылку, он регистрирует в db идентификатор ссылки, но когда я пытаюсь напечатать их в представлении, я получаю «Попытка получить свойство не-объекта».Пытается получить свойство не-объекта по отношению друг к другу

Мои модели:

class NiceAction extends Model 
{ 
    public function logs(){ 

     return $this->hasMany('App\NiceActionLog'); 

    } 
} 

class NiceActionLog extends Model 
{ 
    public function log(){ 

     return $this->belongsTo('App\NiceAction'); 

    } 
} 

Мой контроллер:

Это, как я войти в БД на клик:

public function getNiceAction($action, $name = null){ 
    if ($name == null) { 
     $name = 'you'; 
    } 
    $nice_action = NiceAction::where('name', $action)->first(); 
    $nice_action_log = new NiceActionLog(); 
    $nice_action->logs()->save($nice_action_log); 
    return view('actions.nice', ['action' => $action, 'name' => $name]); 
} 

И это, как я передать loggs к просмотру :

public function getHome(){ 
     $actions = NiceAction::all(); 
     $logged_actions = NiceActionLog::all(); 
     return view('home', ['actions' => $actions, 'logged_actions' => $logged_actions]); 
    } 

И thi s на мой взгляд:

@foreach($logged_actions as $loggedAction) 
      <li>{{ $loggedAction->log->name}}</li> 
    @endforeach 

СПУСТЯ EDIT:

Мои рабочих таблиц выглядит так, если это может быть проблема:

nice_action_logs стол:

public function up() 
{ 
    Schema::create('nice_action_logs', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamps(); 
     $table->integer('nice_action_id'); 
    }); 
} 

nice_actions стол:

public function up() 
{ 
    Schema::create('nice_actions', function (Blueprint $table) { 
     $table->increments('id'); 
     $table->timestamps(); 
     $table->string('name'); 
     $table->integer('niceness'); 
    }); 
} 
+0

Что будет '{{dd ($ loggedAction-> log() -> toSql())}}' return? –

ответ

0

Ваш метод getHome() имеет следующую строку:

$logged_actions = NiceAction::all(); 

Я предполагаю, что это на самом деле значит быть:

$logged_actions = NiceActionLog::all(); 

Поскольку вы все еще получаете ошибку после коррекции это, вероятно, у вас есть запись NiceActionLog, у которой нет связанной записи NiceAction. Из-за этого $loggedAction->log будет null, а затем $loggedAction->log->name даст вам ошибку, которую вы видите.

Вы можете проверить, если журнал существует, прежде чем пытаться получить доступ к собственности на него:

@foreach($logged_actions as $loggedAction) 
    <li>{{ $loggedAction->log ? $loggedAction->log->name : 'No Log' }}</li> 
@endforeach 

На основе вашего обновления с определениями таблиц, ваш belongsTo отношения не определенно правильно. Сторона отношения belongsTo создает имя внешнего ключа на основе имени метода отношений. Вы назвали свой метод отношений log(), поэтому он будет искать поле в таблице nice_actions_logs с именем log_id. Вам нужно либо переименовать свой метод отношений, чтобы он соответствовал полю внешнего ключа, либо вам нужно передать поле внешнего ключа для использования в качестве второго параметра.

class NiceActionLog extends Model 
{ 
    // change the relationship method so the foreign key name will be correct 
    public function nice_action() { 
     return $this->belongsTo('App\NiceAction'); 
    } 
} 

Или

class NiceActionLog extends Model 
{ 
    // leave relationship method alone, but supply the foreign key to the relationship 
    public function log() { 
     return $this->belongsTo('App\NiceAction', 'nice_action_id'); 
    } 
} 

hasMany сторона отношений строит имя ключа иностранного на основе имени класса, так что, так как ваш класс называется NiceAction, он будет искать nice_action_id поле, которое верный. Нет необходимости изменять это определение отношения или имя.

+0

О, да. Спасибо за это. Я редактировал в основном сообщении. Но я все равно получаю ту же ошибку. –

+0

@ IonuţZamfir Я обновил свой ответ. – patricus

+0

он печатает Нет журнала для каждой строки в таблице журналов. –

0

Попробуйте этот код, чтобы посмотреть, что $loggedAction действительно содержит:

@foreach($logged_actions as $loggedAction) 
    <li>{{ var_dump($loggedAction)}}</li> 
@endforeach 

Затем, посмотрите на выходе, и посмотреть, что случилось.

Возможные ответы:

  1. $ loggedAction-> Журнал может быть null
  2. $ loggedAction может быть массивом (не так возможно)

Вы можете проверить переменную бревна перед помещением как это:

@foreach($logged_actions as $loggedAction) 
    <li> 
    @if (property_exists($loggedAction->log,"name")) 
     {{$loggedAction->log->name}} 
    @else 
     No Log 
    @endif 
</li> 
@endforeach 
+0

, когда я делаю var_dump, он дает мне это, о котором я не знаю, что это значит: http://prntscr.com/cc8thw, и когда я делаю ваш @foreach, я получаю No log on every li. Но когда я делаю {{$ loggedAction}}, я получаю точные данные из таблицы журналов в db –

+0

, и когда я делаю {{$ loggedAction-> log}}, он дает мне числа LI, равные строкам в журнале таблицу, но ничего на них, поэтому я думаю, что журнал $ loggedAction-> имеет значение null, но я не понимаю, что я сделал неправильно. –

0

Хорошо, у меня это есть. Я изменил свои модели на эти и сейчас работает:

class NiceAction extends Model 
{ 
    public function NiceAction(){ //changed function's name 

     return $this->hasMany('App\NiceActionLog'); 

    } 
} 

class NiceActionLog extends Model 
{ 
    public function NiceActionLog(){ // changed function's name 

     return $this->belongsTo('App\NiceAction', 'nice_action_id'); // added nice_action_id parameter 

    } 
} 
+0

Почему вы называете отношение 'NiceActionLog()'? Он возвращает объект NiceAction. Поэтому вы должны называть его 'NiceAction()', 'niceAction()' или 'action()'. –

+0

Ну, похоже, имя функции должно быть таким же, как имя таблицы, чтобы это работало. И поскольку мои таблицы называются NiceAction и NiceActionLog, так что функции. –

+0

Вы можете указать отношение любого имени, которое вы хотите. Но соглашение должно называть его так же, как ** родственная ** модель. –