Php 单雄辩关系的多表

Php 单雄辩关系的多表,php,laravel,relationship,Php,Laravel,Relationship,我有一个消息模型,管理员和用户都可以创建消息。但对于管理员和用户,有单独的模型称为Admin和User 消息模型有一个名为“created_by”的列,该列存储创建者的id。现在的问题是如何建立与消息和创建者的关系。我需要从“管理员”模型或“用户”模型中获取创建者的详细信息 目前我在消息模型中使用的方法如下 public function creator(){ if(User::find($this->created_by)){ return User::find($t

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

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

目前我在消息模型中使用的方法如下

public function creator(){
    if(User::find($this->created_by)){
      return User::find($this->created_by);
    }else{
      return Admin::find($this->created_by);
    }
}
但它不支持Laravel中的急切加载特性


谢谢你的帮助

Laravel有访问器,他们非常适合做这类事情。在模型中添加如下方法。这将获取created by id并搜索管理员或用户,然后返回这些结果。因此,现在当您进行消息查询时,只需访问用户,例如$message->created\u by->username;你可以在这里了解更多关于突变的知识


Laravel有一个访问器,他们非常适合做这类事情。在模型中添加如下方法。这将获取created by id并搜索管理员或用户,然后返回这些结果。因此,现在当您进行消息查询时,只需访问用户,例如$message->created\u by->username;你可以在这里了解更多关于突变的知识


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

多态关系允许目标模型使用单个关联属于多个模型类型

通过这样做,您可以从管理员用户模型获取消息

消息模型中定义以下方法

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}
并在迁移文件中添加以下列:

$table->unsignedBigInteger('messageable_id');
$table->string('messageable_type');
然后,在Admin模型中定义以下方法

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}
用户模型中

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}

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

多态关系允许目标模型使用单个关联属于多个模型类型

通过这样做,您可以从管理员用户模型获取消息

消息模型中定义以下方法

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}
并在迁移文件中添加以下列:

$table->unsignedBigInteger('messageable_id');
$table->string('messageable_type');
然后,在Admin模型中定义以下方法

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}
用户模型中

use Illuminate\Database\Eloquent\Model;

class Message extends Model

{
    /**
     * Get the owning messageable model.
     */
    public function messageable()
    {
        return $this->morphTo();
    }
}
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');
    }
}

使用多态关系使用多态关系这也是一个很好的答案,但我觉得当涉及到在二次查询上做出选择时,变异子是更好的解决方案。这只会将条件移动到应用程序请求中稍后的位置,最有可能靠近视图或控制器,但选择“管理”或“用户”的条件将始终存在。mutators有助于更好地延迟加载该条件。@jgetner请注意在使用mutator时保存记录所必须执行的查询次数。您是正确的当使用变异器时,我的意思是laravel中的访问器,它们只在结果上执行,应该不会对您的保存产生影响。我更新了我的答案以反映这一点。但这两种方法都应该可以很好地工作。这取决于您需要访问用户的位置、外观以及对实现最有意义的内容。感谢您的支持,我是否需要向现有的“Message”表中添加任何列?@ShihabEK我更新了答案,以获得数据库表的详细信息。这也是一个很好的答案,但我觉得在选择辅助查询时,使用mutators是更好的解决方案。这只会将条件移动到应用程序请求中稍后的位置,最有可能靠近视图或控制器,但选择“管理”或“用户”的条件将始终存在。mutators有助于更好地延迟加载该条件。@jgetner请注意在使用mutator时保存记录所必须执行的查询次数。您是正确的当使用变异器时,我的意思是laravel中的访问器,它们只在结果上执行,应该不会对您的保存产生影响。我更新了我的答案以反映这一点。但这两种方法都应该可以很好地发挥作用。这取决于您需要在何处访问用户以及用户的外观,以及什么对实现最有意义。感谢您的支持,我是否需要将任何列添加到现有的“消息”表中?@ShihabEK我也更新了答案,以获得数据库表的详细信息。