php - 单一 Eloquent 关系的多个表

标签 php laravel relationship

我有一个消息模型,管理员和用户都可以创建消息。但对于管理员和用户来说,有单独的模型,称为管理员用户

消息模型有一个名为“created_by”的列,用于存储创建者的 ID。现在的问题是我如何与 Message 和 Creator 建立关系。我需要从“管理员”模型或“用户”模型获取创建者详细信息。

目前我正在 Message 模型中使用如下方法。

public function creator(){
    if(User::find($this->created_by)){
      return User::find($this->created_by);
    }else{
      return Admin::find($this->created_by);
    }
}

但它不支持 Laravel 中的预加载功能。

感谢您的帮助。

最佳答案

在这种情况下您应该使用多态关系。如 laravel doc 中所述

A polymorphic relationship allows the target model to belong to more than one type of model using a single association.

通过执行此操作,您可以从管理员用户模型获取消息。

Message模型中定义以下方法。

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}

并在迁移文件中添加以下列:

$table->unsignedBigInteger('messageable_id');
$table->string('messageable_type');

然后,在Admin模型中定义以下方法。

class Admin extends Model
{
    /**
     * Get all of the admin's messages.
     */
    public function messages()
    {
        return $this->morphMany('App\Message', 'messageable');
    }
}

用户模型中。

class User extends Model
{
    /**
     * Get all of the user's messages.
     */
    public function messages()
    {
        return $this->morphMany('App\Message', 'messageable');
    }
}

关于php - 单一 Eloquent 关系的多个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61437026/

相关文章:

php - 查询主实体时如何根据特定字段过滤OneToMany关系的实体

php - 使用 oAuth 或其他方式实现访问

php - 正则表达式提取标签之间的文本,但不提取标签

PHP OOP 架构问题(OOP against Roles)

Laravel - 如何恢复本地存储符号链接(symbolic link)并刷新

laravel - 采条件条件

Laravel 3 - 如何验证复选框数组,至少选中 1 个?

java - 当我在 android 中发送 post 请求时,它什么也不返回。当我向服务器发送发布请求时,它会显示写入内容

javascript - Ember 2,过滤关系模型(hasMany,belongsTo)并根据关系计算计算属性

php - 一对多与mysql中的特定数字