Laravel 4.0:急切加载错误 - 试图获取非对象的属性

时间:2014-06-23 15:01:07

标签: php laravel eager-loading

我试图利用laravel中的渴望加载功能,但它并没有像我预期的那样工作。当我尝试检查在“个人档案”表中没有信息的用户的个人资料时,它会抛出"尝试获取非对象的属性"而不是给出NULL值。我已将用户信息分成两个表 - >用户表和个人档案表。我怎么能过去那个?!

ProfilesController.php        

    use Illuminate\Database\Eloquent\ModelNotFoundException;
    class ProfilesController extends \BaseController {

    public function show($username)
{
    try {
    $user = User::with('profile')->whereUsername($username)->firstOrFail();


    } catch (ModelNotFoundException $e) {

        return Redirect::home()->with('globalerror', 'The user you are trying to search does not exists!');

    }
    return View::make('profiles.show')->withUser($user);
}
   }

Profiles.php模型         

    class Profile extends Eloquent
    {

        public function owner(){
         return $this->belongsTo('User', 'user_id');
          }
    }

Users.php模型         

    use Illuminate\Auth\UserInterface;
    use Illuminate\Auth\Reminders\RemindableInterface;

    class User extends Eloquent implements UserInterface, RemindableInterface {

protected $table = 'users';

    protected $fillable = array('first_name', 'last_name', 'username', 'email', 'password', 'password_temp', 'code', 'active');



    public function profile(){
    return $this->hasOne('Profile');
     }


   }

3 个答案:

答案 0 :(得分:2)

这是使用with()功能的一个失败。即使用户没有个人资料,它也会返回用户。

您可以做的是确保使用isset($user->profile) ? $user->profile : 'user does not have a profile';

之类的内容

或者您可以使用has()代替with(),只有具有个人资料的用户才能获得该用户。

答案 1 :(得分:0)

你可以试试这个:

$user = User::with('profile')->whereUsername($username)->firstOrFail();
return View::make('profiles.show')->withUser($user);

然后在你的view;你可以尝试这样的事情:

@if(isset($user) && isset($user->profile))
    {{ $user->profile->propertyname or '' }}
@endif

答案 2 :(得分:0)

到目前为止唯一可行的方法是,我决定在新用户注册时手动将用户ID插入到profiles表中。这将使急切加载工作没有问题,因为它不会再返回null。这是代码:

    $profile = new Profile;
    $profile->user_id = $user->id;
    $profile->save();`

希望有一天可能会帮助那些人