laravel 自定义多态关联的类型字段 string 转 int 的问题?

自定义多态关联的类型字段
写映射

[
1=>'App\Post',
2=>'App\Commit',
]

但是我有多个表是多对多关系呢?

需要另一套映射

[
1=>'App\Other',
2=>'App\User',
]

多态关联的表类型都用的int,但是1在不同的model中映射的不同的表,这样该怎么做呢?

  public function click()
    {
        if ($this->type == 1) {
            return $this->belongsTo('App\Models\HomeList', 'click_id');
        }
        if ($this->type == 2) {
            return $this->belongsTo('App\Models\SlideShow', 'click_id');
        }
        if ($this->type == 3) {
            return $this->belongsTo('App\Models\ReleaseTask', 'click_id');
        }

        return $this->belongsTo('App\Models\HomeList', 'click_id');
    }

上面的代码结果 $this->type这个值解析不出来,一个if都没进!!!
我该怎么办?

阅读 1.1k
评论
    2 个回答
    • 184

    你是怎么调用这个click方法的,打印$this->type是没有值的吗?

      • 10.4k

      遇到了同样的问题,不知道题主当时是怎么解决的,我这边给解决掉了,原理就是利用 获取器

      clipboard.png

      clipboard.png

      clipboard.png

      下面贴一下代码。

      // Tool 模型
      class Tool extends Model
      {
          const TABLE = 'tool';
          protected $table = self::TABLE;
      
          public function product()
          {
              return $this->morphOne(ShoppingCart::class, 'product');
          }
      
      }
      // Food 模型
      class Food extends Model
      {
          const TABLE = 'food';
          protected $table = self::TABLE;
      
          public function product()
          {
              return $this->morphOne(ShoppingCart::class, 'product');
          }
      }
      // ShoppingCart 模型
      class ShoppingCart extends Model
      {
          const TABLE = 'shopping_cart';
          protected $table = self::TABLE;
      
          public function product()
          {
              return $this->morphTo();
          }
      
          /**
           * @param $val
           * @return mixed|string
           * 这个方法很重要,getter 时数据库拿到的是 $val 中的源值 1、2,
           * 通过获取器修饰为对应的类。
           */
          public function getProductTypeAttribute($val)
          {
              $list = [
                  1 => Tool::class,
                  2 => Food::class,
              ];
              return $list[$val] ?? Tool::class;
          }
      }

      晚些时候通过发布一篇文章来详细描述。


      更加顺手的用好 Laravel 的多态关联 - 开发中的一些奇技淫巧 - SegmentFault 思否

        撰写回答

        登录后参与交流、获取后续更新提醒

        相似问题
        推荐文章