关系不起作用

时间:2016-11-02 13:26:56

标签: php laravel-5

我有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');
    }
}

&#39;秩&#39;用户表中的列应与&#39; id&#39;相同。在排名表中。现在我想得到用户和他的排名信息。试图在很多方面,因为在互联网上找到了很多方法。其中一个就像:

$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)}}

用户名和电子邮件应该来自users表,rank(name) - 来自rank表...但是我只会得到错误。 Cal有人帮帮我吗? :)谢谢!

P.S。对不起问题标题,无法创造更好的东西..

2 个答案:

答案 0 :(得分:0)

您的关系和数据库架构存在一些问题。您的ranks表格应包含user_id列,而不是users列,其中包含rank列。

如果您遵循上述架构,则您的关系应为:

user.php的

public function ranks()
{
    return $this->hasMany('App\Rank');
}

Rank.php

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

<强>更新

对于Many To Many关系,您的表格应为:

user表 - | id | email | ...

rank table - | id | name |

rank_user表 - | id | user_id | rank_id |

rank_user表来自相关模型名称的字母顺序。

将关系定义为:

user.php的

public function ranks()
{
    return $this->belongsToMany('App\Rank');
}

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)}}

Docs

更新2

以下评论的回复

确保您在DB中输入以下内容:

如果您的登录用户id1,那么:

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      |

答案 1 :(得分:0)

看起来你的关系是错误的。

如果多个用户可以拥有相同的排名,则意味着排名可以拥有多个用户(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;

希望这有帮助!