【问题标题】:how to access the defined relation in blade view laravel 5.6如何在刀片视图 laravel 5.6 中访问定义的关系
【发布时间】:2018-11-26 09:57:00
【问题描述】:

我想在我的刀片视图中访问定义的关系,并在我的发票模型中显示我正在这样做

public function users() {
    return $this->hasone('App\Client','id','client_id');
}

在发票控制器中

 public function show(Invoice $invoice)
{
    $clients = Invoice::with('users')->get();
    return view('admin.invoices.show', compact('invoice', $invoice),compact('clients',$clients));
}

最后在我看来我做到了

<td>{{ $clients->users->first()->title }}</td>

但是当我尝试查看时出现此错误

Property [users] does not exist on this collection instance

当我 dd $clients 时,我得到如下关系的结果

 #relations: array:1 [▼
    "users" => Client {#309 ▼
      #fillable: array:14 [▶]
      #connection: "mysql"
      #table: null
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #with: []
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:17 [▼
        "id" => 1
        "title" => "شسی"

【问题讨论】:

  • hasone 有错字,正确的是hasOne
  • 函数名不区分大小写
  • 那是我纠正的自动编译,但不是那不是问题仍然得到同样的错误

标签: php laravel view controller laravel-blade


【解决方案1】:

get() 始终返回 Collection,结果为 0...N。用这一行:

$clients = Invoice::with('users')->get();

$clients 将是 CollectionInvoice 对象。 users 属性在Collection 上不存在,它存在于Collection 内的每个Invoice 上。

确保您正在循环访问您的 $clients 集合并访问单个 Invoice 项目上的 users


注意:虽然这不是您的主要问题,但@Joshua 关于users 的注释是正确的。如果关系存在,hasOne 关系将返回 Model 实例,如果关系不存在,则返回 null。我还建议将名称从users 更改为user,并可能在关系不存在时添加一些保护:

@foreach($clients as $client)
    ...
        <td>{{ $client->user->title ?? 'No Title' }}</td>
    ...
@endforeach

【讨论】:

  • 完整而清晰 :) 谢谢你为我节省了很多时间,我从中学到了,那是我试图在模型集合和单一模型之间理解的部分,谢谢 :)
  • 还有 1 个问题是我可以在没有 get() 方法的情况下获得关系吗???$clients = Invoice::with('users');这样的做法正确吗?
  • @Farshad 我不确定您要做什么(您显示的语法实际上不会运行查询)。您可能想发布另一个问题,详细说明您想要什么。把链接贴在这里,我醒来后看看,但在那之前可能会有其他人回答。
  • @Farshad 更有可能,为了清楚起见,您需要belongsTo 而不是hasOne
  • @patricus 你能帮我解决这个问题吗? stackoverflow.com/questions/50895038/…
【解决方案2】:

删除first()方法调用,你不需要这个,因为你已经通过这样做检索了users

{{ $clients-&gt;users-&gt;title }}

请注意,如果您想使用first() 调用,您应该将查询更改为:

{{ $client-&gt;users()-&gt;first()-&gt;title }}

注意usersusers()在获取雄辩关系方面的区别。

另外,既然你们的关系是hasOne,你应该把users改成user以避免混淆。

【讨论】:

  • 有没有使用 latest() 或其他任何东西来代替 first()?只是为了改变第一个
【解决方案3】:

您正在返回一个客户端集合,因此您需要遍历该集合。

您在称为 users 的客户端模型上定义 hasOne 关系。首先,由于它是一个 hasOne 关系,您应该适当地命名它,在这种情况下只是用户。

你也可以更简洁地定义它:

public function user()
{
    return $this->hasOne(User::class);
}

现在您的第二个问题是您如何尝试检索这种关系。

假设您将一组客户传递给您的视图,例如:

public function clients()
{
    $clients = Client::with('user')->get();
    return view('view.view.view', compact('clients');
}

在您的刀片中,您现在需要遍历您的客户以获得他们的用户关系:

@foreach($users as $user)
    {{ $client->user->user_column_name }}
@endforeach

希望对您有所帮助。

请记住尝试使您的命名尽可能容易理解,是的,这个项目可能只是为了您的眼睛,但是对于从未见过它的人来说,这个简单的 sn-p 代码会变得晦涩难懂。

【讨论】:

  • 感谢帮助的人,还有一个问题,hasmany 关系是否相同?
  • 公共函数 products(){ return $this->hasMany('App\Product','id','product_id'); }
  • $products = Invoice::with('products')->get(); return view('admin.invoices.show', compact('invoice', $invoice),compact('clients',$clients))->with(compact('products',$products)); }
  • 当你定义你的关系时,我的朋友,只需执行:return $this->relationshipType(ModelName::class);
  • 当您将数据发送到视图时,您需要做的只是一个紧凑型和变量名,例如return view('view', compact('invoices', 'clients', 'products');
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 2019-01-19
  • 2020-01-12
  • 2014-03-15
相关资源
最近更新 更多