2016-08-30 15 views
-2

私はlaravelを学ぼうとしていますし、1対多の関係に固執しています。だから、私は3つのリンクを持つページを持って、それらのリンクをクリックしてdbにログインします。すべての良い、私はリンクをクリックし、dbのリンクのIDを登録するが、私はビューでそれらを印刷しようとすると、私は "非オブジェクトのプロパティを取得しようとする"を取得します。1対多の関係で非オブジェクトのプロパティを取得しようとしています

マイモデル:

class NiceAction extends Model 
{ 
    public function logs(){ 

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

    } 
} 

class NiceActionLog extends Model 
{ 
    public function log(){ 

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

    } 
} 

マイコントローラ:

これは私がクリックしたときに、DBへのログイン方法です:

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]); 
    } 

そして、 sが私の見解である:

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

LATER 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

マイtabelsこれが問題になる可能性がある場合には、このようになります。テーブル:

私はこれが実際にあることを意味していると仮定してい

$logged_actions = NiceAction::all(); 

+0

'{{dd($ loggedAction-> log()}> return? –

答えて

0

あなたgetHome()方法は、以下の行を持っているあなたはまだ訂正後のエラーを取得しているので

$logged_actions = NiceActionLog::all(); 

これには、おそらくNiceActionレコードがないNiceActionLogレコードがあります。このため、$loggedAction->lognullになります。次に$loggedAction->log->nameが表示されます。

あなたは、ログがそれにプロパティにアクセスしようとする前に存在しているかどうかを確認することができます:テーブル定義を使用してアップデートに基づいて

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

、あなたのbelongsTo関係が正しく定義されていません。関係のbelongsTo側は、関係メソッドの名前に基づいて外部キー名を作成します。関係メソッドlog()の名前を付けたので、log_idという名前のnice_actions_logsテーブルのフィールドが検索されます。関係メソッドの名前を外部キーフィールドと一致するように変更するか、外部キーフィールドを渡して2番目のパラメーターとして使用する必要があります。関係の

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フィールド、探します正しい。この関係定義または名前を変更する必要はありません。出力を見て、

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

を次に、そして間違っているものを参照してください:

+0

ああ、そうです。ありがとうございました。私はメインポストで編集しました。しかし、私はまだ同じエラーを得るtho –

+0

@IonuţZamfir私は私の答えを更新しました。 – patricus

+0

ログ・テーブルのすべての行にログは出力されません。 –

0

は本当に何を含むか$loggedAction表示するには、このコードを試してみてください。

可能な答え:

  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を行うときには、すべてのログにログがありません。しかし、私が{{$ loggedAction}}を実行するときには、db –

+0

のログテーブルから正確なデータを取得し、{{$ loggedAction-> log}}すると、ログの行と等しい数のLIが得られますテーブルには何もないので、私は$ loggedAction-> logが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

関係に任意の名前を付けることができます。しかし、このコンベンションでは**関連**モデルと同じ名前を付けることになっています。 –

関連する問題