2016-08-18 12 views
0

Laravel 5.2でこのコードを使用してUserettingsと共にユーザーを熱心にロードしようとしています:App\User::with('usersettings')->get()、理由を理解しているようだ。これは与えられたエラーです。Laravelで1対1のリレーションをeager-loadできない

BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::usersettings()' 

私はthe laravel docsを読んでいると私はLaracastsをたくさん見てきたし、これは前に働いていたので、私は、私は本当に小さな、おそらく何かを明らかに欠けているのアイデアを得ます。

User.php

<?php 

namespace App; 

/* User with fields: id, email */ 
class User extends Illuminate\Database\Eloquent\Model { 
    protected $table = 'users'; 

    public function usersettings() { 
     return $this->hasOne("App\Usersettings", "userid"); 
    } 
} 

Usersettings.php

<?php 

namespace App; 

/* Settings with fields: id, userid, textcolor */ 
class Usersettings extends Illuminate\Database\Eloquent\Model { 
    protected $table = 'usersettings'; 

    public function user() { 
     return $this->belongsTo('App\User', 'userid'); 
    } 
} 

//編集:私はすでにSを小文字に試してみました。このタイプミスは、それをSOにコピーすることに悩まされていたかもしれませんが、エラーはそこにありました。

//編集:

<?php 

namespace App; 

use App\UserSettings; 

class User extends Illuminate\Database\Eloquent\Model { 
    protected $table = 'users'; 

    public function settings() { 
     return $this->hasOne(UserSettings::class, "userid"); 
    } 
} 

私はphp artisan tinker >>>App\User::with('settings')->get()を実行すると、予想通り、それは動作しますが、私はphp artisan tinker >>>App\User::with('usersettings')->get()を実行したときに

<?php 

namespace App; 

use App\UserSettings; 

class User extends Illuminate\Database\Eloquent\Model { 
    protected $table = 'users'; 

    public function usersettings() { 
     return $this->hasOne(UserSettings::class, "userid"); 
    } 
} 

の下BadMethodCallException with message 'Call to undefined method Illuminate\Database\Query\Builder::usersettings()'を与えます。私は

+0

多分設定モデルのクラス名にタイプミスがあります。 'Usersettings'の代わりに' UserSettings'を試してみてください( 's 'を大文字にしてください)。また、 'with()'、 'with(UserSettings)'の中で名前を大文字にしてみるべきです。これが解決策だとは思わないでください。 –

+0

'' App \ Usersettings ''を 'Usersettings :: class'に、' 'App \ User'''を' User :: class'にリネームしよう。 – KmasterYC

答えて

0

(それは同様に失敗した)abcにメソッドの名前を変更し、php artisan tinker >>>App\User::with('abc')->get()を実行すると、Userモデルの関係を定義する際に同様にあなたはタイプミス:

public function usersettings() { 
    return $this->hasOne("App\Usersettings", "userid"); 
} 

を私はいくつかのクリーンアップをお勧めします: テーブル 'users'と 'user_settings'に名前をつけて、 フィールド 'userid'を 'user_id'に変更し、 'Usersettings'モデルの名前を 'UserSettings'に変更します。

このように、テーブル名と外部キーを明示的に定義する必要はありません。なぜなら、ラーベルはそれらを「推測」することができるからです。

「ユーザー設定」であることがわかっているため、関係「usersettings()」を「settings()」に変更することもできます。次に、 'User :: with(' settings ') - > get()'のように取得できます。

+0

私は完全に謎めいている。 'usersettings()'メソッドの代わりにusersettings、myrelation、settingsという3つのメソッド名を試しました。 'App \ User :: with( 'usersettings') - > get()'は例外をスローするので、 'App \ User :: with( 'myrelation') - > get() ( 'settings') - > get() 'が動作します。それはどのように可能ですか? – stealthjong

+0

あなたはミスタイプする必要があります、あなたの現在のコードをフィドルや要点に掲示し、リンクを提供する必要があります。 – PawelMysior

+0

追加情報... – stealthjong