Я разрабатываю приложение клиентского портала, используя Angular-7 в качестве интерфейса и Laravel-5.8. Я использую Lave Spatie для управления пользователями. У меня есть эти три таблицы:
CREATE TABLE `company` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`company_id` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`company_name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `trips` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`dispatch_datetime` datetime DEFAULT NULL,
`loading_date` date DEFAULT NULL,
`loaded_from` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`destination` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`company_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `users` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
`company_id` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
Из приведенных выше таблиц у меня есть три класса: User, Company и Trip.
Каждый пользователь принадлежит компании, но не более того.
Каждая компания совершает несколько рейсов.
company_id в компании также является первичным ключом.
Из ApiController я использовал Laravel Spatie, чтобы пользователи могли иметь доступ только к тем данным, которым им предоставлено разрешение. Это работает отлично:
Апиконтроллер.php
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Trip;
use App\User;
use App\Company;
use Illuminate\Support\Facades\Auth;
class TripController extends Controller
{
public function index(Request $request){
if(!Auth::user()->hasPermissionTo('View Trip')){
return response()->json([ "message" => 'User do not have permission'], 401);
}
if(($request->get('sort')!='null' && $request->get('sort')!='') && $request->get('search')){
$trip = Trip::where("trip_number", "LIKE", "%{$request->get('search')}%")->orderby($request->get('sort'), $request->get('order'))->paginate(10);
} else if(($request->get('sort')!='null' && $request->get('sort')!='')){
$trip = Trip::orderby($request->get('sort'), $request->get('order'))->paginate(10);
}
else if($request->get('search'))
$trip = Trip::where("trip_number", "LIKE", "%{$request->get('search')}%")->paginate(10);
else
$trip = Trip::paginate(10);
return response()->json($trip, 200);
}
}
Теперь я хочу добиться следующего из приведенного выше кода:
Вошедший в систему пользователь должен иметь возможность просматривать только поездки, которые осуществляет его компания.
Если вошедший в систему пользователь принадлежит к компании, у которой company_id имеет значение MBB, он должен иметь возможность просматривать все поездки для всех компаний в базе данных, за исключением того, что у него нет разрешения на просмотр поездок. .
Как я могу изменить свой код, чтобы добиться этого?