Отношения извлекают электронные письма пользователя - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь понять, как я могу объединить таблицы users и teams в 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 ]

1 голос
/ 29 сентября 2019

Чего вы пытаетесь достичь, недостаточно ясно. Если я угадаю, вы хотите узнать, какой 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
1 голос
/ 29 сентября 2019

Если вы хотите, чтобы пользователь мог принадлежать к одной команде, тогда вам не нужна промежуточная таблица. Просто добавьте столбец в пользовательскую таблицу, например 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. Если вы хотите, чтобы отношения многие ко многим, вам нужно использовать промежуточную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...