Php 单雄辩关系的多表
我有一个消息模型,管理员和用户都可以创建消息。但对于管理员和用户,有单独的模型称为Admin和User 消息模型有一个名为“created_by”的列,该列存储创建者的id。现在的问题是如何建立与消息和创建者的关系。我需要从“管理员”模型或“用户”模型中获取创建者的详细信息 目前我在消息模型中使用的方法如下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
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我也更新了答案,以获得数据库表的详细信息。