技巧5:文章有许多图像,图像属于文章.拿回收藏品


Laravel 5: Article hasMany Image, Image belongsTo Article. Getting a collection back

当我创建一篇文章时,我可以给它附加一个图像,它作为缩略图。一切正常工作,因为图像被上传到img目录,图像路径被添加到图像表中,并且图像表中的article_id与正在创建的文章的id相关。

在我的RouteServiceProvider中,我有这个:

public function boot(Router $router)
{
    $router->bind('blog', function($id)
    {
        return Article::with('images')->findOrFail($id);
    });
    $router->bind('tags', function($name)
    {
        return Tag::where('name', $name)->firstOrFail();
    });
    parent::boot($router);
}

在我看来,我有:

@foreach ($articles as $article)
    <h2><a href="/blog/{{ $article->id }}">{{ $article->title }}</a></h2>
    <p>{{ $article->body }}</p>
    <small>Posted on {{ date('F d, Y', strtotime($article->created_at)) }} by {{ $article->user->name }}</small>
    <img src="{{ $article->images }}">
@endforeach

{{ $article->images }}返回一个集合,例如:

[{"id":17,"path":"img'/image2.jpg.jpg","article_id":49,"created_at":"2015-10-25 01:57:49","updated_at":"2015-10-25 01:57:49"}]

,它基本上重复上面的每个文章图像在foreach语句中,除了id, article_id, path等都改变。

{{ $article->images->path }}返回错误"Trying to get property of non-object"。我怎样才能在我的routeserviceprovider中编写代码,使它只得到一个图像而不是一个集合,这样我就可以使用{{ $article->images->path }}而没有错误?

如果您的文章每篇只有一个图像,那么使用hasOne()。如果你的文章可以有多个图像,那么你需要迭代每个图像(集合)来获得它们的路径,或者使用->first()…或者编写一个自定义方法,根据它必须满足的任何标准返回单个图像。

我从来没有真正做过RouterServiceProvider方式,不确定规则是否与Controller方式相同。无论如何,"试图获得非对象的属性"错误表明,Laravel认为图像从$article->images不是一个对象,所以,也许,如果它被解码成一个数组,然后可以访问数组的成员作为对象。也许下面的建议会对解决你的问题有所启发。

在控制器:

    return View::make('pages.blog')
       ->with('images', json_decode($article->images));

以下是我是如何想到这个想法的。

代码# 1:

<?php
$data_string = "[{'"id'":17,'"path'":'"img'/image2.jpg.jpg'",'"article_id'":49, '"created_at'":'"2015-10-25 01:57:49'",'"updated_at'":'"2015-10-25 01:57:49'"}, {'"id'":23,'"path'":'"img'/image23.jpg.jpg'",'"article_id'":67, '"created_at'":'"2015-10-25 03:43:11'",'"updated_at'":'"2015-10-25 03:43:11'"}, {'"id'":11,'"path'":'"img'/image11.jpg.jpg'",'"article_id'":44, '"created_at'":'"2015-10-25 10:57:49'",'"updated_at'":'"2015-10-25 10:57:49'"}]";
$articles = json_decode($data_string);
var_dump($articles);
输出:

array(3) {
   [0]=>
   object(stdClass)#1 (5) {
      ["id"]=> int(17)
      ["path"]=>string(18) "img/image2.jpg.jpg"
      ["article_id"]=>int(49)
      ["created_at"]=>string(19) "2015-10-25 01:57:49"
      ["updated_at"]=>string(19) "2015-10-25 01:57:49"
   }
   [1]=>
   object(stdClass)#2 (5) {
      ["id"]=>int(23)
      ["path"]=>string(19) "img/image23.jpg.jpg"
      ["article_id"]=>int(67)
      ["created_at"]=>string(19) "2015-10-25 03:43:11"
      ["updated_at"]=>string(19) "2015-10-25 03:43:11"
   }
   [2]=>
   object(stdClass)#3 (5) {
      ["id"]=>int(11)
      ["path"]=>string(19) "img/image11.jpg.jpg"
      ["article_id"]=>int(44)
      ["created_at"]=>string(19) "2015-10-25 10:57:49"
      ["updated_at"]=>string(19) "2015-10-25 10:57:49"
   }
}
代码# 2:

foreach($articles as $article) {
    echo "article(" . $article->id . "): " . $article->path . "'n"; 
}
输出:

article(17): img/image2.jpg.jpg
article(23): img/image23.jpg.jpg
article(11): img/image11.jpg.jpg