Laravel 5动态创建雄辩模型

贾里德·艾特尼尔

假设我有一个mysql表名称和一个行ID:

['table_name' => 'things', 'row_id' => 11],
['table_name' => 'stuff', 'row_id' => 5]

这些表中的每一个都有一个Eloquent引用该表模型。如何迭代列表并动态使用模型从table_name键和find基于的行中创建新实例row_id

我可以通过Builder实例获取所需的数据,但实际上我需要构造一个Model实例。这是因为我正在通过Eloquent模型实施合同,并从该合同中寻找特定属性。我无法通过Builder实例获取属性。

(我正在使用的包:https : //github.com/jarektkaczyk/revisionable。我正在Revisionable模型上实现

为了澄清一点,这有效:

dd(\App\Models\Thing::find(11)->latestRevision); // returns Revision model

虽然这不是:

// foreach($rows as $row)
$model = new Dynamic([])->setTable($row['table_name']);
dd($model->find($row)); // returns model with correct data
dd($model->find($row['row_id'])->latestRevision); // returns null
// endforeach

如果这还不够清楚,请告诉我。

编辑

dd($model->find($row)); // returns model with correct data but shows table as `null` as if it isn't being persisted across the request.

另外,这是Dynamic模型:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Sofa\Revisionable\Laravel\RevisionableTrait;
use Sofa\Revisionable\Revisionable;

class Dynamic extends Model implements Revisionable
{
    use RevisionableTrait;

    /**
     * @param $table
     */
    public function __construct($attributes = [])
    {
        parent::__construct($attributes);
    }

    /**
     * Dynamically set a model's table.
     *
     * @param  $table
     * @return void
     */
    public function setTable($table)
    {
        $this->table = $table;

        return $this;
    }
}
爱国者

首先,latestRevision是由添加的关系RevisionableTrait,因此您需要确保您的Dynamic类具有该use RevisionableTrait;语句。

接下来,由于该find()方法(和任何其他检索方法)将返回模型的新实例,因此您将需要在找到每个模型后再次重置该表。因此,您的代码如下所示:

$model = new Dynamic([]);
$model->setTable($row['table_name']);
$model = $model->find($row['row_id']);
$model->setTable($row['table_name']);
$revision = $model->latestRevision;

假设您遵循Laravel的命名约定,另一种选择是可以Model从table_name确定名称,并且Model从一开始就使用正确名称,而不是该Dynamic模型:

$modelName = Str::studly(Str::singular($row['table_name']));
$model = $modelName::find($row['row_id']);
$revision = $model->latestRevision;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章