Eloquent 使用一对一关系查询 parent table 总是 returns null
Eloquent Query always returns null for parent table using oneToOne relationship
Parent Table
users
schema | 'id','email','pass'
关系
public function profile()
{
return $this->hasOne('App\Profile','user_id');
}
其他Table
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
等
这 Returns user
的空关系 ??
此外,在 blade 中访问 $profile->user->email
时出现错误
Undefined property: Illuminate\Database\Eloquent\Collection::$user
(View:
C:\xampp\htdocs\laravel1\resources\views\profile\edit.blade.php)
这是 dd()
输出 http://bit.ly/1dA0R5p
它 returns 与 user
关系为空,我怀疑这是导致 blade.undefined property
错误的原因。
这种方法可行吗?我的关系正确吗?
P.S。早些时候,我在查询 User
模型和 eagerload Profile
模型时遇到了一个 vice-versa 案例,并且有效。
片段
$users = \App\User::with('group','profile')->get(); //This was working
您收到 null
是因为您的关系定义有误。您的 profile
型号应该是
public function user()
{
return $this->belongsTo('App\User','user_id');
}
错误是因为您试图从集合中获取 user
对象。
由于您使用 get()
检索数据,您收到的是一组配置文件,而不是单个配置文件。如果您想要单个配置文件,请使用 first()
方法而不是 get()
,否则在循环中使用它。
@foreach ($profiles as $profile)
{{ $profile->user->email }}
@endforeach
如果此行存在于子模型中,请删除 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';
在透明模型中:
public function profile(){
return $this->hasOne('App\Profile');
}
因此您可以检索用户个人资料
$profile = $user->profile? : new Profile;
Parent Table
users
schema | 'id','email','pass'
关系
public function profile()
{
return $this->hasOne('App\Profile','user_id');
}
其他Table
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
等
这 Returns user
的空关系 ??
此外,在 blade 中访问 $profile->user->email
时出现错误
Undefined property: Illuminate\Database\Eloquent\Collection::$user (View: C:\xampp\htdocs\laravel1\resources\views\profile\edit.blade.php)
这是 dd()
输出 http://bit.ly/1dA0R5p
它 returns 与 user
关系为空,我怀疑这是导致 blade.undefined property
错误的原因。
这种方法可行吗?我的关系正确吗?
P.S。早些时候,我在查询 User
模型和 eagerload Profile
模型时遇到了一个 vice-versa 案例,并且有效。
片段
$users = \App\User::with('group','profile')->get(); //This was working
您收到 null
是因为您的关系定义有误。您的 profile
型号应该是
public function user()
{
return $this->belongsTo('App\User','user_id');
}
错误是因为您试图从集合中获取 user
对象。
由于您使用 get()
检索数据,您收到的是一组配置文件,而不是单个配置文件。如果您想要单个配置文件,请使用 first()
方法而不是 get()
,否则在循环中使用它。
@foreach ($profiles as $profile)
{{ $profile->user->email }}
@endforeach
如果此行存在于子模型中,请删除 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';
在透明模型中:
public function profile(){
return $this->hasOne('App\Profile');
}
因此您可以检索用户个人资料
$profile = $user->profile? : new Profile;