#laravel #variables #model #controller #global
Вопрос:
Я работаю в огромном проекте , у меня есть связь между таблицей счетов и почти всеми таблицами,
Я должен установить это в каждом контроллере:
account::find(session("LoggedUser"))->relationship_table();
И это очень раздражает, так есть ли какой-нибудь способ сделать его чище без повторения
, как пример глобальной переменной:
//some where global
$user = account::find(session("LoggedUser"));
//in any controller
$user->relationship_table();
Или любая идея с ПРИМЕРОМ, пожалуйста.
Ответ №1:
Я думаю, что вы можете зарегистрировать retrieved
модельное мероприятие:
class Account extends Model
{
public static function booted()
{
static::retrieved(function ($account) {
$account->loadMissing('relationship');
})
}
}
И, при необходимости, вы можете зарегистрировать глобальную область, чтобы быстро загрузить отношения:
protected static function booted()
{
// The retrieved event
static::addGlobalScope('relationships', function (Builder $builder) {
$builder->with('relationship');
});
}
Поэтому, когда вы получаете набор учетных записей из запроса базы данных, подобного этому:
Account::where(...)->get();
Каждая учетная запись будет иметь отношение.
Комментарии:
1. Спасибо за ваш ответ , но relationship_table вот функция, которую я выполняю, возвращая hasMany, потому что мне нужно сделать это, например : $user->document()->>где(«идентификатор»,$req->>>идентификатор); для каждой таблицы
Ответ №2:
Я быстро исправляю ситуацию в controller.php
namespace AppHttpControllers;
use IlluminateFoundationAuthAccessAuthorizesRequests;
use IlluminateFoundationBusDispatchesJobs;
use IlluminateFoundationValidationValidatesRequests;
use IlluminateRoutingController as BaseController;
use IlluminateHttpRequest;
use AppModels;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
public $user;
public function __construct()
{
BaseController::middleware(function($req, $next){
if(session()->has("LoggedUser")){
$this->user = Modelsaccount::find(session("LoggedUser"));
}elseif(session()->has("user")){
$this->user = Modelsaccount::find(session("owner"));
}
return $next($req);
});
}
}
Здесь отношения
namespace AppModels;
use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;
class account extends Model
{
use HasFactory;
public function document()
{
return $this->hasMany(userDocument::class,'owner_id','id');
}
}
И когда мне нужно позвонить, просто напишите в любом контроллере
$this->$user->document()->get();
Это позволит получить все документы, которыми владеет пользователь в сеансе
Может быть, это не лучший способ, но он лучше, я все еще жду других ответов, которые сделают его лучше