Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel 5动态创建雄辩的模型_Php_Laravel_Revisionable - Fatal编程技术网

Php Laravel 5动态创建雄辩的模型

Php Laravel 5动态创建雄辩的模型,php,laravel,revisionable,Php,Laravel,Revisionable,假设我有一组mysql表名和一个行id: ['table_name' => 'things', 'row_id' => 11], ['table_name' => 'stuff', 'row_id' => 5] 每个表都有一个引用该表的雄辩的模型。如何迭代列表并动态使用模型从表名键创建新实例,并根据行id键查找行 我可以通过Builder实例获得所需的数据,但我确实需要构建模型实例。这是因为我正在通过雄辩的模型实现一个契约,并从该契约中寻找一个特定属性。我无法通过生成器

假设我有一组mysql表名和一个行id:

['table_name' => 'things', 'row_id' => 11],
['table_name' => 'stuff', 'row_id' => 5]
每个表都有一个引用该表的
雄辩的
模型。如何迭代列表并动态使用模型从
表名
键创建新实例,并根据
行id
键查找行

我可以通过
Builder
实例获得所需的数据,但我确实需要构建
模型
实例。这是因为我正在通过
雄辩的
模型实现一个契约,并从该契约中寻找一个特定属性。我无法通过生成器实例获取属性

(我正在使用的包:。我正在模型上实现
可修改的

要澄清一点,这是有效的:

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.
此外,以下是
动态
模型:

<?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;
    }
}
$modelName = Str::studly(Str::singular($row['table_name']));
$model = $modelName::find($row['row_id']);
$revision = $model->latestRevision;

首先,
latestRevision
是由
RevisionableTrait
添加的一个关系,因此您需要确保您的
动态
类具有
使用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的命名约定,另一个选项是,您可以从表名称中确定
模型
名称,并从一开始就使用正确的
模型
,而不是此
动态
模型:

<?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;
    }
}
$modelName = Str::studly(Str::singular($row['table_name']));
$model = $modelName::find($row['row_id']);
$revision = $model->latestRevision;

您是否添加了
使用RevisionableTracit到您的
动态
latestRevision
是由该特性添加的关系,因此如果您的
Dynamic
类不使用该特性,它将不具有该关系。实际上,我确实忘记了将该特性添加到
Dynamic
模型中,但是该关系仍然没有加载。我认为这可能与我在原始问题中提供的编辑有关。这是因为
find()
将返回模型的一个新实例,该实例不会设置表名。您需要执行如下操作:
$model=newdynamic([])$模型->可设置($row['table_name'])$model=$model->find($row['row_id'])$模型->可设置($row['table_name'])$修订=$model->latestRevision是的,成功了。你能把你的意见写进一个答案,这样我就可以接受了吗?谢谢谢谢,我也在考虑第二种方法。@JaredEitnier没问题。这两种方法各有利弊。第二种方法的“gotchas”更少,但如果您偏离了Laravel命名约定,代码将不再有效。不过,很高兴我能帮忙。我将坚持第一种方法。动态命名Laravel 5中的模型将变得混乱。@我可以简单地创建一个与“动态”的雄辩模型使用相同视图的雄辩模型,而不将其保存到数据库中吗?我想,如果我用嵌套的父构造函数创建构造函数,并在实例化后传递null值和应用属性值,我可能会创建一个模型。假设
$model=newmodel()$model->name=“测试假人”`但我知道我必须做更多的工作,因为我已经测试过了。