Laravel 4 Eloquent Problems选择hasMany Relation

时间:2014-10-25 09:52:52

标签: laravel laravel-4 eloquent

我有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";

错误: enter image description here

2 个答案:

答案 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';

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