关系检索用户电子邮件

时间:2019-09-29 16:44:53

标签: laravel laravel-5

实际上,我试图了解如何将表usersteams联接到members吗?

用户表:

id |   name  |         email          |     password
 1     alain        alain@gmail.com          *****
 2     eric         eric1@gmail.com          *****

团队表:

id |     name          
 1      R.O.S    
 2      Stephanois   

成员表:

id |     user_id  (email)        |    team_id (name)
 1          1                             1
 2          2                             1

数据库:

public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('email')->unique();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        });
    }

public function up()
    {
        Schema::create('members', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned()->nullable();
            $table->foreign('user_id')->references('id')->on('users');
            $table->integer('team_id')->unsigned()->nullable();
            $table->foreign('team_id')->references('id')->on('teams');
            $table->timestamps();
        });
    }

 public function up()
        {
            Schema::create('teams', function (Blueprint $table) {
                $table->increments('id');
                $table->string('name');
                $table->integer('user_id')->unsigned()->nullable();
                $table->foreign('user_id')->references('id')->on('users');
                $table->timestamps();
            });
        }

用户模型:

protected $fillable = [
        'name', 'email', 'password',
    ];

public function team(){
        return $this->hasOne('App\Team', 'user_id', 'id'); ?
    }

public function member(){
        return $this->hasOne('App\Member', 'user_id', 'id'); ?
    }

团队模型:

protected $fillable = [
        'user_id', 'name'
    ];

public function member(){
        return $this->hasMany('App\Member', 'team_id'); ?
    }

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

会员型号:

protected $fillable = [
        'id', 'user_id', 'team_id'
    ];

public function team(){
    return $this->belongsTo('App\Team', 'team_id');
    }

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

在此先感谢您的帮助

编辑:当我使用用户“ alain@gmail.com”登录时,我没有检索到用户“ alain@gmail.com”的信息吗?即user_id和team_id。

public function index(Request $request)
    {   

        $user = $request->user();
        $members = Member::query()
        ->when($user->hasRole('admin') !== true, function (Builder $query) use ($user) {
         $query->where('id???', $user->email); ????
        })
        ->when($request->has('search'), function (Builder $query) use ($request) {
        $query->where('name??', 'like', '%' . $request->input('search') . '%');
         })->with('team:id,name') 
        ->paginate(5);

        return view('admin.members.index', compact('members'))
        ->with('display_search', $user->hasRole('admin'));

    } 

2 个答案:

答案 0 :(得分:1)

如果您希望用户可以属于一个团队,那么就不需要中间表。只需在用户表中添加一列,例如team_id,即可保留用户所属团队的值。

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->string('password');
    $table->unsignedInteger('team_id'); //make it nullable or anything based on your need
    $table->rememberToken();
    $table->timestamps();
});

Schema::create('teams', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->timestamps();
});

现在在模型中建立关系:

User模型

protected $fillable = [
        'name', 'email', 'password','team_id'
    ];

public function team()
    {
        return $this->belongsTo('App\Team', 'team_id');
    }

Team模型

protected $fillable = [
        'name'
    ];

public function users()
    {
        return $this->hasMany('App\User', 'team_id');
    }

在上述关系中,一个用户属于一个团队,一个团队有许多用户。我很确定您正在努力实现这一目标。随时询问您是否发现难以理解的内容。

  

看起来您不需要中间模型Member。如果要建立多对多关系,则需要使用中间表。

答案 1 :(得分:1)

您要实现的目标还不够明确。如果我猜到了,您想找出哪个user位于哪个team中,那么在这种情况下,您可以进行-

User.php 模型-

protected $fillable = [
    'name', 'email', 'password',
];
public function member(){
        return $this->belongsTo('App\Member', 'user_id', 'id');
}

Member.php 模型-

protected $fillable = [
        'id', 'user_id', 'team_id'
    ];

public function team(){
    return $this->belongsTo('App\Team', 'team_id');
}

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

Team.php 模型(目前保持不变)-

class Team extends Model
{
    protected $fillable = [
        'name'
    ];
}

最后调用您的控制器方法中已经在团队中的成员-

$members = Member::with('team', 'user')->get();
return view('your-blade-file-name', compact('members'));

而且,在您的刀片文件中-

@foreach($members as $member)
     <p>Name: {{ $member->user->name }} , Email: {{ $member->user->email }} , Team - {{ $member->team->name }}</p>
@endforeach

输出:

Name: alain, Email: alain@gmail.com , Team - R.O.S

Name: eric, Email: eric1@gmail.com , Team - R.O.S