【问题标题】: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');
    }
}

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

【问题讨论】:

    标签: laravel laravel-5 eloquent laravel-5.8


    【解决方案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 的未来版本中引发错误)
    猜你喜欢
    • 2020-08-21
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 2017-07-23
    • 2019-04-06
    • 1970-01-01
    • 2020-03-22
    • 2019-11-10
    相关资源
    最近更新 更多