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

dxxyhpgq  于 2022-12-26  发布在  PHP
关注(0)|答案(1)|浏览(168)

我是新来的laravel,也问了关于laracast的问题,到目前为止没有任何成功。
我的问题是:我的数据库布局如下所示:

Table: categoryA_products
Table: categoryB_products
Table: categoryC_products

默认为Laravel用户表:

Table: user

我已经创建了两个Laravel口才模型:
产品名称:

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 );
        }
}

由于每个产品都有一个不同的表名,我通常会为每个表创建一个模型,但由于它们都是相似的,我希望在运行时定义模型表名。
我知道我可以使用"$product-〉setTable()"来完成这一操作,但是由于我使用了Laravel中的"newRelatedInstance"类(hasMany和belongsTo),所以我无法初始化product类并设置表。
是否有解决方法?
是的,我知道我可以创建一个类别表,并将产品链接到每个类别,但这是一个虚构的数据库模型。使用这种方法是有原因的,如果需要,我可以更详细地解释它。也就是说,它对这个示例是有意义的,但我不能将其用于实时数据库。
我有一个工作解决方案,每个"* 类别 *"都有一个模型,但这非常混乱。
任何帮助都将不胜感激。

bgibtngc

bgibtngc1#

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

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

相关问题