【问题标题】:Property [owner] does not exist on this collection instance此集合实例上不存在属性 [所有者]
【发布时间】:2017-09-29 03:41:23
【问题描述】:

我有点难以准确理解 Laravel 在这里试图传达什么以及 Eloquent 如何建立/附加这些关系。

Property [owner] does not exist on this collection instance.

我正在创建一个客户支持收件箱,客户可以在其中发送工单,管理员可以回复。

我希望能够在消息中提取用户的姓名和一些详细信息,以便代表知道他们在与谁交谈。目前有三张桌子在玩:tickets, users, & replies。我也会在这里分解结构:

Tickets: id, user_id, body, active (boolean), datestuff... | relates to the Ticket model
replies: id, user_id, ticket_id, body, datestuff | relates to the Reply model.

我通过owner的公共方法在$this->belongsTo(User::class,'user_id');的Ticket模型中定义了关系

public function owner()
    {
        // ESTABLISH RELATIONSHIP

        $this->belongsTo(User::class, 'user_id');

    }

但是当我尝试检索以下内容时,我检索到标题中的错误。从门票控制器

$tickets = Ticket::latest()->get();
return $tickets->owner;

我无法{{ $ticket->owner->first_name }} 或我想提取的用户的任何详细信息。

要么我对 Eloquent 的基本理解不正确,要么需要分配其他内容才能启用此功能?

我一直在关注 Laracast 的这一集,在这里用 Thread 代替 Ticket,但 Reply 命名空间仍然存在。虽然我没有检索与回复关联的用户数据,而是检索初始票证的用户数据。

https://laracasts.com/series/lets-build-a-forum-with-laravel/episodes/3

【问题讨论】:

  • 首先你需要使用return来返回关系对象,其次你必须告诉用户ids是table1name.id,tablename2.id如果两者都不是以表名命名的,那么返回$ this->belongsTo(User::class,'table1name.id', 'tablename2.id');
  • 尝试 $Ticket = Ticket::with("owner")->latest()->get(); 然后尝试 $Ticket->owner
  • 如果您想从用户表中检索特定信息,那么您可以尝试这样 $Ticket = Ticket::with(["owner" => function($q){ return $q-> select("..","..");}]->latest()->get();

标签: laravel eloquent relationships


【解决方案1】:
$tickets = Ticket::latest()->get();
return $tickets->owner;

此代码获取票的集合该集合中的每张票都有其自己的所有者。

foreach($tickets as $ticket) {
    // this is where you have $ticket->owner;
}

您的owner() 函数也没有返回关系 - 它创建了一个关系,但没有做任何事情。这会起作用的:

public function owner() {
    return $this->belongsTo(User::class, 'user_id');
}

【讨论】:

  • 然后在视图文件中运行:{{ $ticket->owner }}}。我正在检索一个App\Ticket::owner must return a relationship instance. 错误:( 所以看起来关系无法实例化?
  • @IanBuss 那是因为你的public function owner() 没有return 任何东西。它需要return $this->belongsTo(User::class, 'user_id'); 将其添加到我的答案中。
  • **内部尖叫,因为我已经尝试了大约两天了,现在你是最好的:) **
  • 肯定去过那里。很高兴我能帮上忙!
猜你喜欢
  • 2020-11-12
  • 2019-03-23
  • 2020-07-11
  • 2017-05-12
  • 2018-10-12
  • 2021-02-08
  • 2021-12-16
相关资源
最近更新 更多