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

时间:2018-06-17 07:07:25

标签: php laravel view controller laravel-blade

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

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

当我得到$ 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" => "شسی"

3 个答案:

答案 0 :(得分:3)

get()始终返回Collection,结果为0 ... N.有了这条线:

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

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

确保您循环浏览$clients个收藏集并访问各个users项目的Invoice

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

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

答案 1 :(得分:1)

删除first()方法调用,您不需要这样做,因为您通过执行以下操作检索了users

{{ $clients->users->title }}

请注意,如果您要使用first()调用,则应更改查询:

{{ $client->users()->first()->title }}

注意获取雄辩关系时usersusers()之间的区别。

此外,由于您的关系为hasOne,因此您应将users更改为user以避免混淆。

答案 2 :(得分:1)

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

您正在定义名为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

希望有所帮助。

请记住尝试让你的命名尽可能容易理解,是的,这个项目可能只适合你的眼睛,但只是这个简单的代码片段变得模糊不清,因为那些从来没有见过它的人会发生什么事情。