Eloquent Query始终使用oneToOne关系为父表返回null

时间:2015-06-12 04:50:29

标签: php laravel eloquent laravel-5 one-to-one

父表

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

关系

profiles
schema | 'id','user_id'/*foreign key to users table */ ,'address','city'

其他表

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

关系

Profile

我正在查询User模型,希望能够使用public function edit($id){ $profile = \App\Profile::with('user')->where('id','=',$id)->get(); dd($profile); } 模型进行加载。

User

这样我就可以加载用户的个人资料以进行编辑,以及来自email模型的详细信息数据,例如pass& user等。

这返回$profile->user->email的空关系?

此外,在刀片中,当访问dd()时会出错

  

未定义属性:Illuminate \ Database \ Eloquent \ Collection :: $ user   (视图:   C:\ XAMPP \ htdocs中\ laravel1 \资源\视图\轮廓\ edit.blade.php)

以下是user输出http://bit.ly/1dA0R5p

它返回带有undefined property关系的null,这是我怀疑在刀片中导致User错误。

这种方法可行吗?我的关系是否正确?

P.S。之前我在查询Profile模型和eagerload $users = \App\User::with('group','profile')->get(); //This was working 模型时遇到了反之亦然的情况。 段

{{1}}

2 个答案:

答案 0 :(得分:0)

您收到null因为您的关系定义错误。您的profile模型应为

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

错误是因为您试图从集合中获取user对象。

由于您已使用get()检索数据,因此您收到的是配置文件集合,而不是单个配置文件。如果您想要一个配置文件,请使用first()方法而不是get(),否则在循环中使用它。

@foreach ($profiles as $profile)
   {{ $profile->user->email }}
@endforeach

答案 1 :(得分:0)

如果子模型中存在此行,则删除use SoftDeletes;

namespace App;
use Illuminate\Database\Eloquent\Model;
//use Illuminate\Database\Eloquent\SoftDeletes;
use App\User;
class Profile extends Model
{
//    use SoftDeletes;

/**
 * The database table used by the model.
 *
 * @var string
 */
protected $table = 'profile';

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = ['address', 'user_id'];

protected $primaryKey = 'user_id';

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

现在设置$primaryKey = 'user_id';

在oparent Model中:

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

因此您可以检索用户个人资料

$profile = $user->profile? : new Profile;