Php Laravel 5动态创建雄辩的模型
假设我有一组mysql表名和一个行id: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实例获得所需的数据,但我确实需要构建模型实例。这是因为我正在通过雄辩的模型实现一个契约,并从该契约中寻找一个特定属性。我无法通过生成器
['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=“测试假人”`但我知道我必须做更多的工作,因为我已经测试过了。