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
型号在哪里?您能告诉我名称空间的类名吗?