2017-02-21 22 views
0

さて、質問があります。私は本当に複雑なレポートをプログラミングしており、インターフェイスはLaravel 5.2を使用しています。今は、特定の条件によっては、ユーザーが必ずしもすべてのパラメータを入力する必要はありません。しかし、わかりやすくするために、レポートには何があっても常に完全なパラメータセットが受信されるように作成しました。だから私は3つのテーブルを持っている:Laravel 5.2の関係を使用してデフォルト値でパラメータを設定する

tblReportParam 
ID 
ParamName 
DefaultValue 

tblReportParamValue 
ParamID 
ReportID 
Value 

tblReport 
ID 
UserName 

は今、私は機能するソリューションを持っていますが、私はモデルとの関係をより有効に活用することができるはずのようないくつかの理由で、それだけで感じています。私は基本的に私のモデルとコントローラだけを持っていて、SQLを使ってすべてを解決しました。

thisに多少近いと感じますが、それほどではありません。基本的には、すべてのパラメータを常にロード/保存する必要があります。パラメータxが実際にユーザによって定義されていれば、その定義を使用します。そうでない場合は、tblReportParamで定義されたデフォルトを使用します。誰にどのようにこれを行うにはどのような考えがありますか?

EDIT:わかりましたので、私はエディの答えをチェックし、我々のシステムでそれを仕事にしようとしたが、私の他の同僚がtblReportParamValueとtblReportとtblReportParamテーブル間の多対多の関係を実装し始め

ピボットとして機能するので、私はこのソリューションを私たちのシステムに適応させるのにいくつかの困難を抱えています。ここでは、2つのモデルがあります:(すなわち、関係が実際に存在する)

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'); 
    } 

} 

は今、これは実際にはかなりきちんとした解決策ですが、パラメータは、ピボットテーブルに実際にある場合にのみ動作します。私たちが望むのは、ピボットテーブルにないパラメータの場合、単にデフォルト値が必要なだけです。この場合、Eddyのソリューションは使えますか?今tblReportParamValueは、あなたがあなたの関係を再定義する必要があり、ピボットテーブルであることを雄弁モデル

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

を使用して

答えて

0

ReportParamモデルで

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

そしてReportモデルでを追加し、今では1 ReportParamは多くの報告がありますので、ReportParamからデフォルト値があまりにも複雑になり得て、反対

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

を定義しました。したがって、$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

もちろん、すべてのコレクションをチェックするために2番目の機能を変更する必要があります。 – EddyTheDove

+0

私はあなたが何を意味するのかを視覚化するのに少し問題があります。いくつかのコードを投稿できますか?前もって感謝します :)。 – Osuwariboy

関連する問題