Laravel 5 动态创建 Eloquent 个模型
Laravel 5 Dynamically create Eloquent Models
假设我有一个 mysql table 个名称和一个行 ID:
['table_name' => 'things', 'row_id' => 11],
['table_name' => 'stuff', 'row_id' => 5]
这些 table 中的每一个都有一个引用 table 的 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
class有use RevisionableTrait;
声明.
接下来,由于 find()
方法(和任何其他检索方法)return 模型的新实例,您需要在每个模型上再次重置 table找到它。因此,您的代码将类似于:
$model = new Dynamic([]);
$model->setTable($row['table_name']);
$model = $model->find($row['row_id']);
$model->setTable($row['table_name']);
$revision = $model->latestRevision;
另一种选择,假设您遵循 Laravel 的命名约定,您可以从 table_name 中确定 Model
名称,然后使用正确的 Model
] 从一开始,而不是这个 Dynamic
模型:
$modelName = Str::studly(Str::singular($row['table_name']));
$model = $modelName::find($row['row_id']);
$revision = $model->latestRevision;
假设我有一个 mysql table 个名称和一个行 ID:
['table_name' => 'things', 'row_id' => 11],
['table_name' => 'stuff', 'row_id' => 5]
这些 table 中的每一个都有一个引用 table 的 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
class有use RevisionableTrait;
声明.
接下来,由于 find()
方法(和任何其他检索方法)return 模型的新实例,您需要在每个模型上再次重置 table找到它。因此,您的代码将类似于:
$model = new Dynamic([]);
$model->setTable($row['table_name']);
$model = $model->find($row['row_id']);
$model->setTable($row['table_name']);
$revision = $model->latestRevision;
另一种选择,假设您遵循 Laravel 的命名约定,您可以从 table_name 中确定 Model
名称,然后使用正确的 Model
] 从一开始,而不是这个 Dynamic
模型:
$modelName = Str::studly(Str::singular($row['table_name']));
$model = $modelName::find($row['row_id']);
$revision = $model->latestRevision;