Как объединить три таблицы с Laravel и сохранить целостность данных - PullRequest
0 голосов
/ 18 декабря 2018

Я использую Laravel 5.7 и сейчас пытаюсь установить связь между тремя таблицами с именем:

  • Билеты (PK - TicketID, FK - CampusID)
  • Кампус (PK -CampusID, FK - TechID)
  • Пользователь (PK - TechID)

Не думаю, что я правильно настроил свои модели, так как показываю билет, где CampusID нетне принадлежат к TechID.Я ищу лучшую практику по настройке Eloquent для сохранения целостности данных, чтобы я мог предотвратить любые отклонения.Как упоминалось выше, внешний ключ для Tickets должен ссылаться на первичный ключ Campus, а внешний ключ Campus должен ссылаться на первичный ключ User.

Вот мои Models:

Билет

protected $table='tickets';

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

Кампус

protected $table='campus';

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

Пользователь

public function campus()
{
    return $this->hasMany(Campus::class, 'TechID');
}

public function ticket()
{
    return $this->hasMany(Ticket::class, 'AssignedTo');
}

Вот мой контроллер:

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Auth;
use App\Campus;
use App\Ticket;

class PagesController extends Controller
{

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
    }

    // Dashboard Page
    public function index()
    {
        $user = Auth::user();
        $campuses = Campus::where('TechID',$user->id)->pluck('CampusName');
        $tickets = Ticket::all()->where('AssignedTo', $user->id);

        return view('home')->with(['user' => $user,'campuses'=>$campuses,'tickets'=>$tickets]);
    }
    // Queue Page
    public function Queue() {
        return view('Pages.Queue');
    }
    // Reports Page
    public function Reports() {
        return view('Pages.Reports');
    }
    // Search Page
    public function Search() {
        return view('Pages.Search');
    }
}

Я думаю, что с моими моделями все в порядке, но мой контроллер, вероятно, там, где я допустил некоторые ошибки.Я уже пытался читать вопросы здесь, смотреть видео и читать документы Laravel, но пока что ничего со мной не задело.Я действительно ценю любую помощь.В идеале это должно каскадно меняться.Поэтому, если у меня возникнет ситуация, когда я захочу изменить местоположение, к которому относится технология, я могу просто внести изменения в таблицу Campus, вероятно, в столбец TechID.

1 Ответ

0 голосов
/ 18 декабря 2018

Я бы использовал Eager Loading .

public function index()
{
    $user = User::with([
        'campuses' => function($query) {
           $query->select(['id', 'CampusName']);     
        }, 
        'tickets'
      ])->where('id', Auth::id())->first();

    $campuses = $user->campuses->pluck('CampusName');
    $tickets = Ticket::all()->where('AssignedTo', $user->id);

    return view('home')->with([
       'user' => $user,
       'campuses'=>$user->campuses->pluck('CampusName'),
       'tickets'=>$user->tickets]);
}

EDIT

Вам необходимо обновить модель пользователя.

public function campuses()
{
    return $this->hasMany(Campus::class, 'TechID');
}

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