2017-02-21 17 views
0

Итак, у меня есть вопрос. Я программирую очень сложный отчет, и интерфейс использует Laravel 5.2. Теперь дело в том, что в зависимости от определенных условий пользователь не всегда должен заполнять все параметры. Однако для целей простоты я сделал это так, чтобы отчет всегда получал полный набор параметров независимо от того, что. Поэтому у меня есть три таблицы:Заполнение параметров значением по умолчанию с использованием отношений в Laravel 5.2

tblReportParam 
ID 
ParamName 
DefaultValue 

tblReportParamValue 
ParamID 
ReportID 
Value 

tblReport 
ID 
UserName 

Теперь у меня есть решение, которое работает, но по некоторым причинам, он просто чувствует, что я должен быть в состоянии сделать лучше использовать модели и отношений. У меня в основном есть только мои модели и контроллеры, и я решил все это с помощью SQL.

Чувствуется несколько близко к this, но не совсем. Поэтому в основном вам нужно всегда загружать/сохранять все параметры. Если параметр x фактически определен пользователем, тогда вы используете его определение, иначе вы идете по умолчанию, заданному в tblReportParam. Кто-нибудь знает, как это сделать?

EDIT:

Хорошо, так что я проверил ответ Эдди и пытался работать его в нашей системе, а другой мой коллега приступил к реализации отношений многие-ко-многим между tblReport и таблицей tblReportParam с tblReportParamValue действуя как стержень, поэтому мне сложно адаптировать это решение для нашей системы. Вот эти две модели:

class ReportParam extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'tblReportParam'; 

    protected $primaryKey = 'ID'; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['ID', 'NomParam', 'DefaultValue']; 

    public function renourapports() 
    { 
     return $this->belongsToMany('App\Report'); 
    } 

} 

class Report extends Model 
{ 
    /** 
    * The database table used by the model. 
    * 
    * @var string 
    */ 
    protected $table = 'tblReport'; 

    protected $primaryKey = 'ID'; 

    /** 
    * The attributes that are mass assignable. 
    * 
    * @var array 
    */ 
    protected $fillable = ['ID', 'NoEmploye', 'NoClient', 'NoPolice', 'DateCreation', 'DateModification', 'runable', 'DernierEditeur']; 

    public $timestamps = false; 

    public function params() 
    { 
     return $this->belongsToMany('App\ReportParam ', 'tblReportParamValue', 'ReportID', 'ParamID')->withPivot('Valeur'); 
    } 

} 

Теперь это на самом деле является довольно изящное решение, но это работает только если параметр на самом деле в сводной таблице (то есть отношения на самом деле существует). Мы хотим, чтобы для параметров, которые не находятся в сводной таблице, мы просто хотим их значение по умолчанию. Может ли решение Эдди работать в этом случае?

ответ

0

Использования Красноречивых моделей

class ReportParam extends Model 
{ 
    public function paramValue() { 
     return $this->hasOne('App\ReportParamValue', 'ParamID'); 
    } 

    public function getDefaultValueAttribute($value) { 
     if ($this->paramValue) return $this->paramValue->Value; //relationship exists 
     return $this->DefaultValue; 
    } 
} 

$reportParam->value; // return the relationship value or the default value; 

UPDATE

tblReportParamValue Теперь, когда это сводная таблица, вы должны пересмотреть свои отношения. В ReportParam модели добавить

public function reports() { 
    return $this->belongsToMany('App\Report', 'tblReportParamValue', 'ParamID', 'ReportID')->withPivot('Value'); 
} 

И в Report модели, определили противоположный

public function params() { 
    return $this->belongsToMany('App\ReportParam', 'tblReportParamValue', 'ReportID', 'ParamID')->withPivot('Value'); 
} 

теперь получает значение по умолчанию из ReportParam становится слишком сложным, потому что это будет один ReportParam имеет много отчетов. Таким образом, $reportParam->reports() вернет каждый отчет, который использует этот paramID в сводной таблице. Поэтому поиск значения будет означать прохождение всех отчетов. Мы могли бы избежать этого, изменив определение функции.

public function getDefaultValue($reportID) { 
    $reportValue = $this->reports()->wherePivot('ReportID', $reportID)->first(); 
    return $reportValue ? $this->reportValue->Value : $this->DefaultValue; 
} 

//In Controller 
$report = Report::find(1); 
$reportParam = ReportParam::find(1); 
$reportParam->getDefaultValue($report->ID); 

Хорошо, я думаю, что это может сработать. Если это не так, мне очень жаль, я не знаю ничего лучше.

+0

Можете ли ваше решение работать в отношениях многих-ко-многим? – Osuwariboy

+0

Конечно, но вам нужно будет изменить вторую функцию, чтобы проверить всю вашу коллекцию. – EddyTheDove

+0

У меня проблемы с визуализацией, что вы имеете в виду. Не могли бы вы разместить какой-то код? Заранее спасибо :). – Osuwariboy