【问题标题】:Laravel 4 Eloquent Problems Select with hasMany RelationLaravel 4 Eloquent Problems Select with hasMany Relation
【发布时间】:2014-10-25 09:52:52
【问题描述】:

我有 2 个模型:相册和照片。

相册 hasMany Photo 和 photo belongsTo('album','id');

就像:

class Photo extends Eloquent {


protected $table = 'photo';

public function album(){
    return $this->belongsTo('album','id');
}}

和

class Album extends Eloquent {


protected $table = 'album';

public function photo()
{
    return $this->hasMany('photo');
}}

在我想尝试选择相册名称并在相册上显示第一张照片之前,我没有问题。

我正在尝试这段代码:

<?php $albums= Album::get();?>
@foreach($albums as $album)
    <pre>{{$photo = $album->photo->first()}}</pre>
@endforeach

和输出:

{"id":1,"images":"1.png","album_id":1,"created_at":"2014-09-08 03:54:36","updated_at":"2014-09-08 03:54:36"}

{"id":3,"images":"3.jpg","album_id":3,"created_at":"2014-09-08 04:30:35","updated_at":"2014-09-08 04:30:35"}

这意味着我有 2 个相册,并且我已经选择了每个相册的第一张照片。

当我尝试调用图像属性时出现错误:

echo "$album->photo->first()->images";

错误:

【问题讨论】:

  • 您收到的错误信息是什么?
  • @lukasgeiter 我已经编辑了错误信息图片
  • 谢谢,但遗憾的是有趣的部分是不可见的。您能否单击左侧的第一个条目(“handleViewException”)并确保右侧的框架滚动到顶部以便我们可以看到实际的错误消息?谢谢
  • @lukasgeiter 抱歉,我没有意识到右侧部分已向下滚动。现在我重新上传
  • 嗯,看起来很奇怪。如果您尝试访问另一个属性怎么办?喜欢:$album-&gt;photo-&gt;first()-&gt;id

标签: laravel laravel-4 eloquent


【解决方案1】:

您的数据库中很可能有一个相册,但没有与之关联的照片。因此,当您遍历相册并回显{{ $album-&gt;photo-&gt;first() }} 时,它只会为任何没有照片的相册输出null(因为显然没有first())而不会引发错误。但是,当您尝试访问没有照片的相册的 image 属性时,您正在尝试获取非对象的属性,即您正在请求 @ 987654325@null 的属性。因此会引发错误。

您可以通过在尝试访问其image 属性之前将输出包装在检查以确保照片存在的@if 语句中来解决此问题:

@foreach($albums as $album)
    @if (count($album->photo))
        {{ $album->photo->first()->image }}
    @endif
@endforeach

有一个快捷方式,使用刀片的or 语法,在尝试回显结果之前检查是否存在。这允许您删除@if 语句:

@foreach($albums as $album)
    {{ $album->photo->first()->id or null }}
@endforeach

【讨论】:

  • 其他一些建议,与您的错误无关,但很好的做法:将一对多关系命名为复数名词是一种惯例,即photos,以帮助您的代码更具可读性.而且您的模型逻辑 ($albums= Album::all();) 不属于您的视图,而是属于控制器。
  • 由于他的代码&lt;pre&gt;{{$photo = $album-&gt;photo-&gt;first()}}&lt;/pre&gt; 有效,我认为没有关联照片不是问题。但无论如何,计数肯定是必要的
  • 不,{{$photo = $album-&gt;photo-&gt;first()}} 工作正常,因为它会为没有照片的相册返回 null。因此,当它在@foreach 循环中回显时, 有照片的相册将显示结果,而没有照片的相册将不显示任何内容。循环运行良好,因为-&gt;first() 只返回null,这不是错误。只有当您尝试访问 null 上的属性时,它才会成为错误。 (我怀疑,从输出中,2 的 id 的相册是没有照片的相册。)
  • 啊,是的,你是对的。这应该是问题所在。
  • 这个问题在 Laravel 中经常出现,当在视图中循环相关记录时。原来有一个速记版本可以取消@if (count...),使用or 快捷方式。所以可以只用一行,{{ $album-&gt;photo-&gt;first()-&gt;id or null }}
【解决方案2】:

首先,我建议在使用 Eloquent 检索表中的所有条目时,使用 ::all() 而不是 ::get(),如 Basic Usage 所示。不确定是否是导致问题的原因,但您可能需要关注文档。

其次,在关系中,hasMany和belongsTo的第一个参数应该是模型类名。所以应该是“Album”和“Photo”,首字母大写。

从你的输出来看,album_id 似乎是外键名。因此,在您的 Photo 类中,将关系更改为以下内容:

public function album(){
    return $this->belongsTo('Album','album_id');
}

刚刚运行您的代码,问题是您没有为模型定义主键。 Laravel 会假设你使用 'id' 作为主键,如果不是这样,你的关系就会破裂。并且最好明确定义主键是什么,以免在涉及外键时产生混淆。所以请添加到模型类中:

protected $primaryKey = 'album_id';

您可以修改代码并查看错误是否仍然存在。它现在没有出现在我的最后。

【讨论】:

  • 我的代码之前没有问题,我已经按照您的建议进行操作,但仍然出错。我已经上传了错误信息图片
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-19
  • 2014-05-30
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多