Laravel 5.4模型属性和方法继承

时间:2017-07-03 18:24:51

标签: php laravel inheritance eloquent laravel-5.4

主要模型是 BaseMonster ,其中包含将由子类继承的怪物(统计数据,怪物类型等)的所有基本信息。

目前,我有两个名为 WildMonster PlayerMonster 的子类,与 BaseMonster 相关,具有一对多的关系(来自BaseMonster)侧)。

我的主要目标是能够从BaseMonster继承属性,如统计数据,名称和图像以及所有相关方法到其他子怪物类。
通过这种方式,我可以避免数据库冗余用于公共属性,同时调整某些子怪物的各个方面只需编辑它们的父BaseMonster记录。
示例:" Kraken"怪物具有太高的攻击力值。只需对 BaseMonster 记录进行简单更改,所有 WildMonster PlayerMonster 实例都与" Kraken"相关被影响到的。

我也希望避免代码冗余,例如在BaseMonster中使用一个rating()方法,该方法将使用所有实际统计数据(以及stat奖金和级别)怪物实例的任何怪物子类可以使用它。

我尝试使用Laravel访问器访问父属性,并将它们设置为 Eloquent base_monster relationship stat,但这样我就无法使用子属性,就像level或health_bonus一样相应地调整值。 (或者至少我没有找到正确的方法) 我也试过设置来自子端的访问者一半成功,但无论如何这意味着我必须在所有子类中编写相同的访问器并且如果我想要改变某些东西会造成巨大的混乱。

如何在laravel 5.4中实现这样的目标?

属性提取

BaseMonster 是其他怪物类的父级,包含大多数场合所需的所有常用属性和方法。 BaseMonsters由游戏管理员创建,用于管理统计信息和图片等内容,并生成新的 WildMonster 以填充各种 Dungeons

BaseMonster (扩展模型

  • 命名
  • 图片
  • 健康
  • 攻击
  • 防御
  • monster_type_id (与MonsterType模型的关系)

WildMonster 是在地下城或其他方面遇到的怪物。可以"转换"如果招募了PlayerMonster

WildMonster (扩展 BaseMonster

  • 名称(自定义特殊遭遇的名称)
  • 级别(相应地调整统计数据)
  • health_bonus (怪物有可能获得各种统计奖励)
  • attack_bonus
  • defense_bonus
  • base_monster_id (与BaseMonster模型的关系)

PlayerMonster 是玩家在战斗后招募的怪物

PlayerMonster (扩展 BaseMonster

  • 名称(最终由玩家自定义)
  • 水平
  • health_bonus
  • attack_bonus
  • defense_bonus
  • base_monster_id (与BaseMonster模型的关系)

1 个答案:

答案 0 :(得分:2)

您正在寻找的是Laravel中的Polymorphic Relations。这样,您可以根据请求定义基本模型 BaseMonster 。按照网站上的示例:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class BaseMonster extends Model
{

    public function monster_wild_or_player()
    {
        return $this->morphTo();
    }

    public function monster_type()
    {
        return $this->hasOne('App\MonsterType');
    }
}

class PlayerMonster extends Model
{

    public function base_info()
    {
        return $this->morphMany('App\BaseMonster', 'monster_wild_or_player');
    }
}

class WildMonster extends Model
{

    public function base_info()
    {
        return $this->morphMany('App\BaseMonster', 'monster_wild_or_player');
    }
}