【问题标题】:Property [X] does not exist on this collection instance laravel relationship此集合实例 laravel 关系上不存在属性 [X]
【发布时间】:2018-05-29 20:49:47
【问题描述】:

我在 laravel 5.6 中使用了很多属性,当我 dd $phonebooks 时,我看到所有关系都正常工作,一切都很好,但是当我尝试在视图中显示它们时,我得到属性错误不存在在这个集合上 这是关系代码

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

这里是控制器

public function index()
{    $phonebooks = Phonebook::with('client')->get();

    return view('admin.phonebooks.index',compact('phonebooks',$phonebooks));
}

最后是我如何尝试在视图中显示它们

<tbody>
@foreach($phonebooks as $phonebook)
    <tr>
        <th scope="row">{{$phonebook->id}}</th>
        <th scope="row">{{$phonebook->title}}</th>
        <td><a href="/admin/phonebooks/{{$phonebook->id}}">{{$phonebook->description}}</a></td>
        <td>{{$phonebook->calldate}}</td>
        <td>{{$phonebook->created_at->toFormattedDateString()}}</td>

        <td>{{ $phonebook->client->title}}</td>
        <td>
            <div class="btn-group" role="group" aria-label="Basic example">
                <a href="{{ URL::to('admin/phonebooks/' . $phonebook->id . '/edit') }}">
                    <button type="button" class="btn btn-warning">ویراییش</button>
                </a>&nbsp;
                <form action="{{url('admin/phonebooks', [$phonebook->id])}}" method="POST">
                    <input type="hidden" name="_method" value="DELETE">
                    <input type="hidden" name="_token" value="{{ csrf_token() }}">
                    <input type="submit" class="btn btn-danger" value="حذف"/>
                </form>
            </div>
        </td>
    </tr>
@endforeach
</tbody>

这里是 dd 的结果只是它的一部分

Collection {#630 ▼  #items: array:3 [▼
0 => Phonebook {#572 ▼
  #fillable: array:5 [▶]
  #connection: "mysql"
  #table: null
  #primaryKey: "id"
  #keyType: "int"
  +incrementing: true
  #with: []
  #withCount: []
  #perPage: 15
  +exists: true
  +wasRecentlyCreated: false
  #attributes: array:8 [▶]
  #original: array:8 [▶]
  #changes: []
  #casts: []
  #dates: []
  #dateFormat: null
  #appends: []
  #dispatchesEvents: []
  #observables: []
  #relations: array:1 [▼
    "client" => Collection {#627 ▼
      #items: array:1 [▼
        0 => Client {#621 ▼
          #connection: "mysql"
          #table: null
          #primaryKey: "id"
          #keyType: "int"
          +incrementing: true
          #with: []
          #withCount: []
          #perPage: 15
          +exists: true
          +wasRecentlyCreated: false
          #attributes: array:16 [▼
            "id" => 1

就这样下去了。

【问题讨论】:

  • $phonebook->Client->title,c不应该小写吗?
  • 尝试客户端而不是客户端
  • 我的代码是小写的对不起我在这里输入的错误,但都试过了,没有运气
  • 尝试用compact('phonebooks')替换compact('phonebooks', $phonebooks)
  • @PhilCross 刚刚做到了,但没有运气,同样的错误:(

标签: php laravel view controller


【解决方案1】:

问题出在这一行:

{{ $phonebook->client->title}}

在你看来。

您已将关系设置为 hasMany 关系,这将返回模型集合。

如果您执行dd($phonebook-&gt;client),它将返回一个集合,而不是单个模型。

它试图在集合对象上调用属性title,而不是模型。

您需要将关系定义更改为hasOne(),或者执行以下操作:

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

(或替代):

{{ $phonebook->client->get(0)->title }}

【讨论】:

  • {{ $phonebook->client->first()->title }} 这只是对我有用,我真的不知道我如何越来越多地阅读你的答案更要了解那里发生了什么:) 因为 laravel 没有提到在 hasMany 中你会得到类似集合对象的东西 :) 多亏了你,你拯救了我的一天;)
  • 任何名称中包含Many 的关系,例如hasManybelongsToMany 将始终返回一个集合对象。当你定义关系时,例如,你的电话簿/客户关系,读作Phonebook hasMany Client,或Client belongsTo Phonebook
  • 哦,我知道了 :) 这很容易:P 谢谢你,菲尔你帮了我很多
  • 你也可以这样做可能更方便:1.将你的函数名改为->clients(),然后2.在你看来你可以这样做->foreach($phonebook ->clients as $client) : //访问客户端endforeach;
【解决方案2】:

最好用has()

$phonebooks = Phonebook::has('client')-&gt;get();

查询关系存在 https://laravel.com/docs/5.7/eloquent-relationships#querying-relations

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 1970-01-01
    • 2020-07-11
    • 2019-07-10
    • 2021-02-18
    • 1970-01-01
    • 2021-07-23
    相关资源
    最近更新 更多