当我使用
get...Attribute
函数时,我遇到了 Laravel 问题。
就我而言,我想区分是否可以从数据库加载所需的值,或者是否需要返回在代码中创建的自定义对象。
这是我的 getComponentACltAttribute
类的 Verification
函数的代码:
public function getComponentACltAttribute($value) {
if($this->superstructure_type == \Config::get('constants.superstructureTypes.standard')) {
return \App\Models\Werte\Product\Brettsperrholz::find($value);
}
else if($this->superstructure_type == \Config::get('constants.superstructureTypes.custom')) {
$customCltA = \App\Models\Werte\Product\BrettsperrholzBenutzerdefiniert::where('schichten_s',$this->component_a_number_of_layers)->where('decklagen_fk', $this->component_a_cover_layer->id)->first();
if($customCltA != null) {
$componentACustomClt = \App\Models\Werte\Product\Brettsperrholz::newModelInstance();
$componentACustomClt->id = 0;
$componentACustomClt->bezeichnung = '';
$componentACustomClt->hersteller_fk = 0;
$componentACustomClt->dicke_d = $this->component_a_thickness;
$componentACustomClt->schichten_s = $this->component_a_number_of_layers;
$componentACustomClt->decklagen_fk = $this->component_a_cover_layer;
$componentACustomClt->t_1 = $this->component_a_t_1;
...
$componentACustomClt->t_11 = $this->component_a_t_11;
$componentACustomClt->o_1 = $customCltA->o_1;
...
$componentACustomClt->o_11 = $customCltA->o_11;
$componentACustomClt->material = 'C24';
$componentACustomClt->zulassung_fk = 0;
return $componentACustomClt;
}
}
}
component_a_clt
对象是Brettsperrholz
类的对象,并且有一个名为decklagen_fk
的属性,当从数据库加载对象时(在$with
中定义自动加载),应该自动加载该属性:
<?php
namespace app\Models\Werte\Product;
class Brettsperrholz extends \App\Models\Base\BaseModel
{
public $table = "tbl_werte_product_brettsperrholz";
protected $hidden = [
];
protected $with = [
'decklage',
];
public function decklage() {
return $this->hasOne(\App\Models\Werte\Product\Decklage::class, 'id', 'decklagen_fk');
}
}
现在我在其他代码区域的
component_a_clt
类的属性 Verification
上遇到问题。
IE。我的代码中有这段代码:
if($reportData["component_" .$component ."_clt"]->decklagen_fk == \Config::get('constants.coverLayer.double')) {...
...其中
$reportData
是 Verification
类的对象。
当我返回自定义创建的component_a_clt
对象时,这段代码不起作用。那我需要使用
if($reportData["component_" .$component ."_clt"]->decklagen_fk->id == \Config::get('constants.coverLayer.double')) {...
但是当我从数据库返回对象时,我需要编写第一个示例中提到的
if
语句。为什么处理方式如此不同?我能做些什么来使其行为相同?
非常感谢您的帮助。
虽然您实际上并没有说出您想要实现的目标,但从所示的
if
陈述来看:
if (
$reportData["component_" .$component ."_clt"]
->decklagen_fk->id == \Config::get('constants.coverLayer.double')
) {
您想知道与您的对象相关的某些数据的特定条件是否成立。
因此,为什么不在原始对象上创建一个函数,而不是从自定义属性 getter 获取关系(它有其他问题,例如返回不同类型的数据),然后将某些属性与
if
条件下的常量进行比较测试条件并返回布尔结果?
这样您就可以隐藏返回
Brettsperrholz
或 BrettsperrholzBenutzerdefiniert
模型的所有混乱细节,并避免必须到处编写不同的条件测试。
你没有说声明
getComponentACltAttribute
函数的地方的类名是什么,所以我就叫它 MainClass
,而且这段代码并不完整,只是为了了解一下想法跨越...
class Mainclass
{
public function isDoubleLayered(): bool
{
// Do all the stuff from your attribute getter function to
// know if you are testing 'decklagen_fk' or 'decklagen_fk->id'
...
return decklagen_fk->id == \Config::get('constants.coverLayer.double');
}
}
这让您的
if
情况更容易
if ($reportData["component_" .$component ."_clt"]->isDoubleLayered()) {
...
}