Laravel 显示所有用户并检查是不是属于 Bans 表

Posted

技术标签:

【中文标题】Laravel 显示所有用户并检查是不是属于 Bans 表【英文标题】:Laravel Showing all users and check if belong to Bans tableLaravel 显示所有用户并检查是否属于 Bans 表 【发布时间】:2020-06-28 15:44:32 【问题描述】:

您好,我正在处理管理仪表板 我想显示所有用户并检查用户是否阻止从禁令表中获取有关禁令的信息 我正在使用 cybercog/laravel-ban 来禁止用户 Laravel 5.8

所以我有两张桌子 用户表和禁令表

Bans 表在名为 :bannable_id 的列中包含带状用户的用户 ID

用户模型:

namespace App;
use Illuminate\Notifications\Notifiable;
use Cog\Contracts\Ban\Bannable as BannableContract;
use Cog\Laravel\Ban\Traits\Bannable;
use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;

use Illuminate\Support\Facades\Auth;
use Illuminate\Auth\Events\Verified;
class User extends Authenticatable implements MustVerifyEmail,BannableContract

use Notifiable;
use Bannable;


protected $fillable = [
    'name', 'email', 'password',
    'last_login_at',
    'last_login_userganet',
    'avatar','uid'
];


/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

/**
 * The attributes that should be cast to native types.
 *
 * @var array
 */
protected $casts = [
    'email_verified_at' => 'datetime',
];

public function UserBan()

    return $this->hasOne('App\Ban','bannable_id');

禁止模式:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Ban extends Model




protected $fillable = [
    'id','expired_at','bannable_type'
];
protected $casts = [
    'bannable_type'
];
public function Users()

    return $this->belongsTo('App\User');



用户控制器:


    namespace App\Http\Controllers;

    use App\User;
    use App\Ban;
    use App\Http\Requests\UserRequest;
    use Illuminate\Http\Request;
    use Illuminate\Support\Str;
    use Illuminate\Support\Facades\Auth;
    use Illuminate\Support\Facades\Hash;
    use Cog\Contracts\Ban\Bannable;
    class UserController extends Controller
    
        /**
         * Display a listing of the users
         *
         * @param  \App\User  $model
         * @return \Illuminate\View\View
         */
        public function index(User $model,Ban $banModel)
        


            return view('users.index', ['users' => $model->paginate(15),'bans'=>$banModel->paginate(15)]);
        

用户架构:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('users', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->timestamp('last_login')->nullable();
            $table->string('last_login_provider')->nullable();
            $table->string('last_login_useragent')->nullable();
            $table->string('last_login_ip')->nullable();
            $table->string('uid')->nullable();
            $table->string('password');
            $table->string('avatar')->nullable();
            $table->string('facebook_id')->unique()->nullable();
            $table->string('google_id')->unique()->nullable();
            $table->string('twitter_id')->unique()->nullable();
            $table->string('instagram_id')->unique()->nullable();
            $table->enum('user_type',['member','admin'])->default('member');
            $table->boolean('blocked')->default(false);
            $table->timestamp('banned_at')->nullable();
            $table->rememberToken();
            $table->timestamps();
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('users');
    


我找不到禁令架构,但这是禁令表:

【问题讨论】:

【参考方案1】:

你使用了错误的关系,你应该使用多态。看下面的链接。 https://laravel.com/docs/5.8/eloquent-relationships#one-to-one-polymorphic-relations

应该是这样的

用户模型

public function ban()

   return $this->morphOne('App\Ban', 'bannable');

禁止模式

public function bannable()

   return $this->morphTo();

获取控制器中的所有用户

定义

use App\User;

然后

$users = User::all();

然后你可以 foreach 它并在每个上调用 ban() 方法

foreach($users as $user)

//return associated ban model
$user->ban;

或者为了更好的性能,使用

User::with(ban)->get(); 

大大减少了 SQL 调用的数量。它检索所有具有禁令模型的用户。查看下面链接中的急切加载。

https://laravel.com/docs/5.8/eloquent-relationships#eager-loading

希望对您有所帮助。 :)

【讨论】:

对不起,我是 laravel 的新手,非常感谢,如何在控制器中获取并显示它? THX ban() 方法不兼容,但它可以(应该)已经在 Bannable trait 中实现,尝试在 User::class 中注释“ban”方法 看特征是否有ban()方法 我评论了禁令方法并运行它得到错误:使用未定义的常量禁令 - 假定为“禁令”(这将在 PHP 的未来版本中引发错误)

以上是关于Laravel 显示所有用户并检查是不是属于 Bans 表的主要内容,如果未能解决你的问题,请参考以下文章

Laravel eloquent 检查不存在的多对多关系

Laravel 8 如何连接 2 个表并检查值是不是存在

Laravel:检查是不是有新项目添加到 db 表并安排一个工作给用户发送电子邮件

使用 Session ID 检查会话是不是处于活动状态 - Laravel

检查列中的所有值是不是都属于特定组

Laravel如何验证一行中的数据,而不是检查整个表