>我有 2 个模型:用户和排名
<?php
namespace App;
use Illuminate'Foundation'Auth'User as Authenticatable;
class User extends Authenticatable
{
/**
* The attributes that are mass assignable.
*
* @var array
*/
protected $fillable = [
'username', 'email', 'password','registered_at','last_action','ip','about_user','reputation','rank','moderator_notes','verified','verify_code',
];
public $timestamps=false;
/**
* The attributes that should be hidden for arrays.
*
* @var array
*/
protected $hidden = [
'password', 'remember_token',
];
public function ranks() {
return $this->hasOne(Rank::class,'id','rank');
}
}
和
<?php
namespace App;
use Illuminate'Database'Eloquent'Model;
class Rank extends Model
{
protected $table = "ranks";
public $timestamps = false;
public function user() {
return $this->belongsTo('App'User');
}
}
用户表中的"排名">列应与排名表中的"id"相同。现在我想获取用户和他的排名信息。尝试了很多方法,因为在互联网上发现了很多方法。其中之一是:
$user = User::where('id',$id)->where('username',$username)->first()->ranks();
但是现在我无法访问任何用户信息,只能获取排名信息...我的观点如下所示:
Username: {{$user->username}}<br/>
Email: {{$user->id==Auth::id()?$user->email:'nerodomas'}}<br/>
Rank: {{print_r(Auth::user()->ranks()->name)}}
用户名和电子邮件应来自用户表,排名(名称(应来自排名表...但是我只收到错误。有人帮我吗?:)谢谢!
附言对不起问题标题,无法创造更好的东西..
看起来你们的关系方式不对。
如果多个用户可以具有相同的排名,则意味着一个排名可以具有许多用户(hasMany(。
你的关系应该是
排名模型
public function users()
{
return $this->hasMany(User::class, 'rank', 'id');
}
用户模型
public function userRank()
{
return $this->belongsTo(Rank::class, 'rank', 'id');
}
理想情况下,您希望在用户表上具有名为 rank_id
的列。这样,您就不必在关系中定义本地键和外键,并且可以在User
模型中调用关系rank()
。
对于您的用户查询id
应该是唯一的,因此您也不需要查询用户名,但我将使用您的原始查询作为示例:
$user = User::where('id',$id)->where('username',$username)->first();
然后,要获得排名关系,您可以:
$rank = $user->userRank; //Rank model
$rank->name; //Rank name
甚至:
$rankName = $user->userRank->name;
希望这有帮助!
您的关系和数据库架构存在一些问题。您的ranks
表应该有user_id
列,而不是users
表有rank
列。
如果您遵循上述模式,那么您的关系应为:
用户.php
public function ranks()
{
return $this->hasMany('App'Rank');
}
等级.php
public function user()
{
return $this->belongsTo('App'User');
}
更新
对于Many To Many
关系,您的表应为:
user
表 - |id|电子邮件|...
rank
表 - |id|名称|
rank_user
表 - |id|user_id|rank_id|
rank_user
表派生自相关型号名称的字母顺序。
将关系定义为:
用户.php
public function ranks()
{
return $this->belongsToMany('App'Rank');
}
等级.php
public function users()
{
return $this->belongsToMany('App'User');
}
然后,您可以将其查询为:
$user = User::where('id',$id)->where('username',$username)->with('ranks')->first();
在您看来,您可以将其用作:
Username: {{$user->username}}<br/>
Email: {{$user->id==Auth::id()?$user->email:'nerodomas'}}<br/>
Rank: {{print_r(Auth::user()->ranks->first()->name)}}
Rank: {{print_r($user->ranks)}}
文档
更新 2
对以下评论的回应
确保你在数据库中有这样的条目:
如果您登录的用户id
1
则:
user
表
|id|name|
+-------+
|1 |Sam |
role
表
|id|name |
+----------------+
|1 |Administrator|
|2 |Moderator |
role_user
表
|id|user_id|role_id|
+------------------+
|1 |1 |1 |
|2 |1 |2 |