【问题标题】:Laravel Eloquent Model change table name on runtime in a related instanceLaravel Eloquent Model 在运行时在相关实例中更改表名
【发布时间】:2018-02-09 00:26:55
【问题描述】:

我是 Laravel 的新手,并且在 Laracast 上问过这个问题,到目前为止没有任何成功。

这是我的问题:我有一个类似这样的数据库布局:

Table: categoryA_products
Table: categoryB_products
Table: categoryC_products

默认情况下是 Laravel 用户表:

Table: user

我已经创建了两个 Laravel Eloquent 模型:

产品:

namespace App;

use Illuminate\Database\Eloquent\Model;

class Product extends Model
{

    // protected $table = '';

    public function users()
    {
        return $this->belongsTo( User::class );
    }

}

用户:

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{

    public function products()
        {
            return $this->hasMany( Product::class );
        }
}

由于每个产品都有不同的表名,我通常会为每个表创建 1 个模型,但由于它们都相似,我想在运行时定义模型表名。

我知道我可以使用“$product->setTable()”来做到这一点,但是当我使用 Laravel 的“newRelatedInstance”类(hasMany 和 belongsTo)时,我无法启动产品类并设置表格。

有解决办法吗?

是的,我知道我可以创建一个类别表并将产品链接到每个类别,但这是一个虚构的数据库模型。这种方法是有原因的,如果需要,我可以更详细地解释它。也就是说,这个示例有意义,但我不能将它用于实时数据库。

我有一个可行的解决方案,每个“类别”都有一个模型,但这很混乱。

任何帮助将不胜感激。

【问题讨论】:

  • 你研究过多态关系吗?
  • 是的,但我仍然需要为每个类别创建一个模型,我会尽量避免 - 除非我错过了多态领域的某些内容
  • 为每个categoryX_product 表设置单独的模型有什么问题?如果所有表都可以使用相同的模型,那么拥有多个表有什么意义?
  • 好点。我有大约 60 个类别,它们与用户表有共享关系,但与其他模型有一些单独的关系,我可以根据类别扩展特征。拥有 60 个模型,其中 90% 的模型是相同的,这对我来说似乎是多余的。这就是为什么我尝试完成这项工作
  • 但是您可以拥有一个具有通用功能的产品模型,然后为每个类别扩展该模型。

标签: php eloquent laravel-5.5 has-many laravel-eloquent


【解决方案1】:

由于您无法加载关系,您可以尝试引用并重新初始化它们,如下所示:

$relations = $product->getEagerLoads();
$attributes = $product->getOriginal();

table_name = 'categoryA_products'; // or categoryB_products or categoryC_products

$product->newQuery()
        ->newModelInstance($attributes)
        ->setTable($table_name)
        ->setEagerLoads($relations)
        ->...

【讨论】:

    猜你喜欢
    • 2016-03-06
    • 2015-02-09
    • 2016-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多