Отображение 2 типов данных в Laravel - PullRequest
0 голосов
/ 01 октября 2019

У меня есть 2 типа пользователей Athletes и Teams. Я создал 3 таблицы users, athletes & teams. Я храню имя пользователя и пароль в таблице users и другую информацию в таблице athletes & teams. Я хотел бы отобразить информацию Athletes и Teams на домашней странице.

Модель моего пользователя похожа на

<?php

namespace App;

use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

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

    protected $fillable = ['email','password','remember_token','category_id'];

    public function team()
    {
        return $this->hasOne(Team::class);
    }

    public function athlete()
    {
        return $this->hasOne(Athlete::class);
    }
}

Модель моей команды - ниже

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Team extends Model
{    
  public $guarded = [];

  protected $fillable = ['first_name','last_name','user_id','how_did_find','social_media',];

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

Модель моего спортсмена - ниже

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Athlete extends Model
{    
  public $guarded = [];

  protected $fillable = ['user_id','social_media','youtube_video','website'];

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

Я использую приведенный ниже код в контроллере.

$staff_picks = User::orderBy('id','desc')->take(10)->with('athlete','team')->get();

Ответы [ 2 ]

4 голосов
/ 01 октября 2019

Вот как это должно быть

class User extends Authenticatable
{
    use Notifiable;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $guarded = [];

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

    protected $fillable = ['email','password','remember_token','category_id'];

    public function team()
    {
        return $this->hasOne(Team::class);
    }

    public function athlete()
    {
        return $this->hasOne(Athlete::class);
    }
}


class Team extends Model
{    
  public $guarded = [];

  protected $fillable = ['first_name','last_name','user_id','how_did_find','social_media',];

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

class Athlete extends Model
{    
  public $guarded = [];

  protected $fillable = ['user_id','social_media','youtube_video','website'];

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

И запрос

$staff_picks = User::orderBy('id','desc')->take(10)->with('athlete','team')->get();

И итерация

foreach($staff_picks as $r){ 
    $r->teams->social_media; //(user can be either teams or athletes so must check for null) 
    $r->athletes->social_media; //(user can be either teams or athletes so must check for null) 
}
1 голос
/ 01 октября 2019

В модели спортсмена и команды создайте столбец с именем user_id, а в модели пользователя создайте два метода как отношение hasMany для моделей атлета и команды. После входа в систему получите данные как

User::where('id', 1)->with('teams', 'athletes')->first();

Отношения внутри пользовательской моды могут быть записаны как показано ниже.

teams() {
  return $this->hasMany(Team::class);
}
athletes() {
  return $this->hasMany(Athlete::class);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...