如何在刀片视图 laravel 5.6 中访问定义的关系

Posted

技术标签:

【中文标题】如何在刀片视图 laravel 5.6 中访问定义的关系【英文标题】:how to access the defined relation in blade view 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 函数名不区分大小写 那是我纠正的自动编译,但不是那不是问题仍然得到同样的错误 【参考方案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 你能帮我解决这个问题吗? ***.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');

以上是关于如何在刀片视图 laravel 5.6 中访问定义的关系的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 5.6 的一个刀片文件中使用不同的形式

刀片视图中的laravel未定义变量

如何在 Laravel 5 中访问刀片中的 URL 段?

如何从 laravel 刀片访问 JWT?

在Laravel 5.6中重置密码链接

laravel刀片视图中的变量未定义错误