laravel делает модель найденной в глобальной переменной для всех контроллеров

#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();
 

Это позволит получить все документы, которыми владеет пользователь в сеансе

Может быть, это не лучший способ, но он лучше, я все еще жду других ответов, которые сделают его лучше