我有2个型号:专辑&照片。
专辑有很多照片和照片属于('专辑',' 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";
错误:
答案 0 :(得分:3)
您的数据库中可能有一个没有与之关联的照片的相册。因此,当您循环播放相册并回显{{ $album->photo->first() }}
时,它会为任何没有照片的相册输出null
(因为显然没有first()
)而不会抛出错误。但是,当您尝试访问没有照片的相册的image
属性时,您尝试获取非对象的属性,即您要求的image
的{{1}}属性。因此会抛出错误。
您可以通过将输出包装在null
语句中来解决此问题,该语句会在尝试访问其@if
属性之前检查以确保照片存在:
image
有一个快捷方式,使用刀片的@foreach($albums as $album)
@if (count($album->photo))
{{ $album->photo->first()->image }}
@endif
@endforeach
语法,在尝试回显结果之前检查是否存在。这允许您删除or
语句:
@if
答案 1 :(得分:0)
首先,我建议在使用Eloquent检索表中的所有条目时,使用:: all()而不是:: get(),如Basic Usage所示。不确定是否会导致问题,但您可能需要按照文档进行操作。
其次,在关系中,hasMany和belongsTo的第一个参数应该是模型类名。所以它应该是'专辑'和'照片',首字母大写。
从您的输出判断,album_id似乎是外键名称。因此,在Photo类中,将关系更改为以下内容:
public function album(){
return $this->belongsTo('Album','album_id');
}
刚运行代码,问题是您没有为模型定义主键。 Laravel会假设您使用'id'作为主键,如果不是这样,那么您的关系将会中断。并且明确定义主键是什么总是更好,以避免在涉及外键时出现混淆。所以请添加到模型类:
protected $primaryKey = 'album_id';
您可以修改代码并查看错误是否仍然存在。它现在还没出现在我的最后。