我可以更改 Laravel 多态关系中的类型列吗?

问题描述 投票:0回答:1

我的 Laravel 项目中有三种不同的模型;车队、用户、司机。驱动程序与用户是不同的模型,因为它们无法进行身份验证。不管怎样,还有一种模型:Address。

我将地址值存储在

addresses
表,地址模型中。下面给出了列;

addresses
:
addressable_type (int)
,
addressable_id (int)
...

还有一个名为 Type 的模型,它存储项目中所有内容的类型。例如,它存储授权类型(超级用户、用户、管理员等)、在 Models\ 路径下给出的雄辩模型类型(App\Models\User、App\Models\Driver 等)、付款类型等...

我想你已经明白我要问你什么了,但让我们继续。如果你明白的话,我没有将

addresses
.
addressable_type
的类型设置为
varchar(255)
。通常,多态模型可以读取
App\Models\*
格式,但我想从
types
.
id
表中存储雄辩模型的 id。

addressable_type    | 1
addressable_id      | 10 // this refers to `types`.`id`
country             | 225
state               | 2175
city                | 108155
address             | NULL
status              | 1
created_at          | 2024-08-31 14:50:13
updated_at          | 2024-08-31 14:50:13

id                  | 10
type                | App\Models\Convoy // so this is record in the types table
label               | 2
created_at          | 2024-08-31 14:50:12
updated_at          | 2024-08-31 14:50:12

Convoy.php 如下;

class Convoy extends Model
{
    use HasFactory;
    protected $guarded = [];

    public function address() : MorphOne
    {
        return $this->morphOne(Address::class, 'addressable');
    }
}

地址.php如下;

class Address extends Model
{
    use HasFactory;
    protected $guarded = [];

    public function addressable() : MorphTo
    {
        return $this->morphTo();
    }

    public function status() : BelongsTo
    {
        return $this->belongsTo(Status::class);
    }
}

HomeController.php 如下;

public function convoys() : View
    {
        $test = Convoy::with('address')->find(6);
        dd($test);
        return view('convoys', compact('convoys'));
    }

结果;

App\Models\Convoy {#1228 ▼ // app/Http/Controllers/HomeController.php:50
  ...
  #relations: array:1 [▼
    "address" => null
  ]
  ...
}

我找不到任何地址。

php mysql laravel
1个回答
0
投票

试试这个

class Address extends Model
{
......
    public function addressable()
        {
            return $this->morphTo()->morphWith([
                App\Models\Convoy::class => ['addressable_type'],
                App\Models\User::class => ['addressable_type'],
                App\Models\Driver::class => ['addressable_type'],
            ]);
        }
    ....
    }
© www.soinside.com 2019 - 2024. All rights reserved.