Laravel Eloquent模型在相关实例中的运行时更改表名

时间:2018-02-09 00:26:56

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

我是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)时,我无法启动产品类并设置表。

有解决方法吗?

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

我有一个工作解决方案,每个“类别”都有一个模型,但这非常混乱。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:0)

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

$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)
        ->...