Laravel Eloquent的问题-关系不起作用

时间:2019-09-25 13:55:22

标签: php laravel eloquent

我是Laravel的初学者。我在Laravel 5.8中有项目。

我有User模型:

class User extends Authenticatable implements MustVerifyEmail
{
    use Notifiable;
    use psCMS\Presenters\UserPresenter;
    use scopeActiveTrait;

    public static $roles = [];
    public $dates = ['last_activity'];

    // ...    

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

    // ...
}

UserLoginHistory

class UserLoginHistory extends Model
{
    protected $quarded = ['id'];
    public $timestamps = false;
    protected $fillable = ['user_id', 'date_time', 'ip'];

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

我想通过此代码显示用户登录历史记录:

User::history()->where('id', $idAdmin)->orderBy('id', 'desc')->paginate(25);

但是它不起作用。

此功能不起作用-我没有结果。

我该如何解决?

4 个答案:

答案 0 :(得分:1)

首先,您将关系定义为范围(以scope关键字作为关系的前缀)。尝试为此更新您的模型关系:

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

然后,根据您的查询,您似乎想获取所有UserLoginHistory 给定User的记录。您可以通过两种方式(至少)完成此操作。

UserLoginHistory模型本身开始,通过外键值约束查询:

$userId = auth()->id(); // get the user ID here.

$results = UserLoginHistory::where('user_id', $userId)->paginate(15);
//                                  ^^^^^^^ your FK column name

根据User模型,使用您定义的关系:

$userId = auth()->id(); // get the user ID here.

$results = User::find($userId)->history;

第二种方法的缺点是您需要手动对结果进行分页。

答案 1 :(得分:1)

在用户模型中,您应该通过以下方式定义您的关系:

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

然后,如果要使用历史记录模型进行选择,则可以使用 WhereHas()方法:

User::whereHas(['history'=>function($q) use ($idAdmin) {
    $q->where('id',$idAdmin)
}])->orderBy('id', 'desc')->paginate(25);

答案 2 :(得分:0)

您必须进行此更改

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

用法

$user = User::find($idAdmin);
$userHistories = $user->history()->latest()->paginate(25);

或获取具有所有历史记录的用户

User::with('history')->find($idAdmin);

答案 3 :(得分:0)

    // Post model 

    namespace App;
    use App\User;
    use Illuminate\Database\Eloquent\Model;
    class Post extends Model
    {
         public function categories()
        {
 return $this->belongsToMany('App\Category')->withTimestamps();
        }
    }


    // Category model 


    namespace App;
    use Illuminate\Database\Eloquent\Model;
    class Category extends Model
    {
            public function posts()
        {
            return $this->belongsToMany('App\Post')->withTimestamps();
        }
    }