Laravel - get...具有自定义创建的返回或数据库加载对象的属性函数

问题描述 投票:0回答:1

当我使用

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
语句。为什么处理方式如此不同?我能做些什么来使其行为相同? 非常感谢您的帮助。

php eloquent laravel-8
1个回答
0
投票

虽然您实际上并没有说出您想要实现的目标,但从所示的

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()) {
    ...
}
© www.soinside.com 2019 - 2024. All rights reserved.