Laravel从多条消息中获取用户
我有Laravel从多条消息中获取用户,laravel,Laravel,我有报价表和id 消息带有列的表提供id和发件人 和带有id的用户表 我想让用户在offerSource 我的目标是让用户至少回复一条信息 我开始用函数消息配置Offer模型以获取消息 public function messages(){ return $this -> hasMany('App\Message'); } 因此,我能够获得所有消息(从提供资源开始): 'users'=>$this->messages 我现在应该如何配置消息模型以获取所有用户而不是消息 我试图在消
报价
表和id
消息
带有列的表提供id
和发件人
和带有id
的用户
表
我想让用户在offerSource
我的目标是让用户至少回复一条信息
我开始用函数消息配置Offer
模型以获取消息
public function messages(){
return $this -> hasMany('App\Message');
}
因此,我能够获得所有消息(从提供资源开始):
'users'=>$this->messages
我现在应该如何配置消息模型以获取所有用户而不是消息
我试图在消息中写入模型:
public function fromContact()
{
return $this->hasOne(User::class, 'id', 'from');
}
然后:
'users'=>$this->messages->fromContact
但我有一个错误:“消息”:“此集合实例上不存在属性[fromContact]”,
我应该如何更正代码以使其正常工作?在消息模型中,您必须指定引用用户的列:
public function fromContact()
{
return $this->hasOne(User::class, 'from');
}
然后在获取消息后,在消息上循环以获得如下用户:
foreach ($this->messages as $message) {
$user = $message->fromContact;
// do somthing with the user :)
}
您的消息表中有from
字段,该字段引用User
模型,而offer\u id
字段引用offer
模型,这意味着您在offer
和User
之间有许多关系
提供型号
public function users(){
return $this->belongsToMany(User::class, 'messages', 'offer_id', 'from')->using('App\Message');
}
信息透视
class Message extends Pivot {
protected $table = 'messages';
}
用户模型
public function offers(){
return $this->belongsToMany(Offer::class, 'messages', 'from', 'offer_id')->using('App\Message');
}
public function toArray($request)
{
$users = $this->users;
return [
'id' => $this->id,
... //add your offer fields here
'users' => $users->toArray(), // here $users is a laravel Collection
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
报价来源
public function offers(){
return $this->belongsToMany(Offer::class, 'messages', 'from', 'offer_id')->using('App\Message');
}
public function toArray($request)
{
$users = $this->users;
return [
'id' => $this->id,
... //add your offer fields here
'users' => $users->toArray(), // here $users is a laravel Collection
'created_at' => $this->created_at,
'updated_at' => $this->updated_at,
];
}
从控制器或路由访问
Route::get('/offer', function () {
return new OfferResource(Offer::with('users')->find(1)); //eager load users
});
我假设消息
表上的发件人
字段是使用用户ID填充的。然后您可以在报价
和用户
模型之间建立归属关系。因为这实际上是一个与透视表messages
的多对多关系
在报价中
模型定义
public function users()
{
return $this->belongsToMany('App\User', 'messages', 'offer_id', 'from');
}
然后从offersource
加载offers
数据,如下所示-
$offers=App\Offer::with('users')->get()代码>
然后像这样在$offers
上循环:
foreach ($offers as $offer) {
dd($offer->users); // one offer will have multiple users as a Collection
}
同样,对于ID为1
的$offer
,您也可以这样做
$offer=App\offer::with('users')->find(1)
然后,要获得对此优惠发表评论的用户
,只需使用$offer->users
有关定义多对多关系的信息,请参阅。因为$this->messages
将返回一个集合,因此您必须在该集合上循环以获取一条消息,然后使用$message->fromContact
!谢谢你的建议,我将尝试一下,但是在单个查询中不可能做到吗?要使用某种Laravel内置方法吗?除了用户在users表上查询并将其与messages和offers表连接外,我不知道还有什么方法!我正在尝试此操作,但它在消息模型中给出了一个错误:“消息”:“语法错误,意外的'$table'(T_变量),期望函数(T_函数)或常量(T_常量)”,
请添加受保护的$table='messages'
@gileneusz您尝试过此操作吗?我刚刚在简单添加:$users=Offer::with('users')->find之后进行了尝试($this->id);return$users;
到我的OfferSource我有CRSF错误,这意味着一切都错了:)对不起,我需要休息一下,这是一个非常简单的问题,laravel无法处理:/我正在阅读文档,但实际上这并不是那么简单,让我在OfferSource中尝试这个外部错误:“message”::“Class'App\\Http\\Resources\\App\\Offer'notfound',
你能试试$offers=\App\Offer::with('users')->get();
这个而不是$offers=App\Offer::with('users')->get();
?问题是,使用合适的名称空间Offer
模型。我在回答中省略了一个斜杠(``````)。再次:“消息”:”Class'App\\Http\\Resources\\App\\Offer'not found',
您似乎无法在资源类中进行任何查询您的Offer
型号在哪里?您能告诉我名称空间的类名吗?