簡體   English   中英

關系不起作用

[英]Relationships don't work

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

用戶名和電子郵件應該來自用戶表,並且排名(名稱)-來自排名表...但是我只會得到錯誤。 卡爾有人幫我嗎? :) 謝謝!

附言:PS抱歉,您的問題標題無法創造出更好的結果。

您的關系和數據庫架構中存在一些問題。 您的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 |電子郵件| ...

rank表-| id |名稱|

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

文件

更新2

對以下評論的回應

確保在數據庫中輸入以下內容:

如果您登錄的用戶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      |

看來您的人際關系走錯了路。

如果多個用戶可以具有相同的等級,則意味着一個等級可以具有許多用戶(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;

希望這可以幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM