具有关系的模型的自定义字段/列属性

时间:2019-05-24 21:45:13

标签: php laravel backpack-for-laravel

我试图弄清楚在设置具有关系的字段时必须如何创建自定义属性。

所以我有学生,他们与促销具有 hasMany 的关系。现在我的问题是当我想要的属性在另一个模型/表中时。例如,我需要皮带颜色,但是皮带颜色未存储在促销中。促销表仅包含 belt_id 。我需要从皮带表中提取该皮带的颜色。我已经建立了所有关系,但是我不知道如何操纵属性。我希望这是有道理的。

$this->crud->addField([
    'label' => "Promotions",
    'type' => 'select2_multiple',
    'name' => 'promotion',
    'entity' => 'promotion', 
    'attribute' => 'name', // <- how can I make a custom query for this?
    'pivot' => true, 
]);

谢谢!

1 个答案:

答案 0 :(得分:0)

似乎我找到了解决方案并修复了一个小错误。.至少看起来像是错误,因为我找不到此功能的文档。.我通过检查代码找到了它。无论如何,很酷的事情是我们可以使用“。”链接关系,因此列设置将如下所示:

$this->crud->addColumn([
   'label' => "Rank", // Table column heading
   'type' => "select",
   'name' => 'promotion_id', // the column that contains the ID of that connected entity;
   'entity' => 'promotion.belt', // <- here I'm chaining the model relationships
   'attribute' => 'color', // the belt's attribute
   'model' => "App\Models\Promotion" // foreign key model
]);

从理论上讲,一切都可以正常工作,但是位于vendore\backpack\crud\src\CrudPanel.php的方法中存在一个小错误:

private function getRelationModelInstances($model, $relationString)
{
    $relationArray = explode('.', $relationString);
    $firstRelationName = array_first($relationArray);

    // this is the line with the bug
    //$relation = $model->{$firstRelationName};

    // Fix the bug above
    if($model instanceof Collection) {
        $relation = $model->{$firstRelationName};
    } else {
        $relation = $model[$firstRelationName];
    }

    $results = [];
    if (! empty($relation)) {
        if ($relation instanceof Collection) {
            $currentResults = $relation->toArray();
        } else {
            $currentResults[] = $relation;
        }

        array_shift($relationArray);

        if (! empty($relationArray)) {
            foreach ($currentResults as $currentResult) {
                $results = array_merge($results, $this->getRelationModelInstances($currentResult, implode('.', $relationArray)));
            }
        } else {
            $results = $currentResults;
        }
    }


    return $results;
}

基本上,此递归函数在调用自身时会将$model参数作为array而不是object传递..因此,当它尝试从{中获取$firstRelationName时,像$model这样的{1}}会导致错误。


与此同时,我发现了一个更好的解决方案。为了实现相同的目标,我使用了$model->{$firstRelationName}

在我的accessors模型中,我有:

promotion

对于 /* |-------------------------------------------------------------------------- | RELATIONS |-------------------------------------------------------------------------- */ public function belt() { return $this->belongsTo('App\Models\Belt'); } /* |-------------------------------------------------------------------------- | ACCESORS |-------------------------------------------------------------------------- */ public function getPromotionSummaryAttribute() { return $this->belt()->get()[0]->color . ', ' . $this->stripe . ' stripe'; } ,我有:

students

列设置非常简单,如下所示:

    /*
    |--------------------------------------------------------------------------
    | RELATIONS
    |--------------------------------------------------------------------------
    */
    public function promotion()
    {
        return $this->hasMany('App\Models\Promotion');
    }

    /*
    |--------------------------------------------------------------------------
    | ACCESORS
    |--------------------------------------------------------------------------
    */

    public function GetLastPromotionAttribute()
    {
        return $this->promotion()->get()->last()->promotion_summary;
    }

我希望这会对外面的人有所帮助:)