首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >belongsTo 5:文章hasMany图像,图像Laravel文章。取回集合

belongsTo 5:文章hasMany图像,图像Laravel文章。取回集合
EN

Stack Overflow用户
提问于 2015-10-26 05:21:28
回答 2查看 618关注 0票数 0

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

在我的RouteServiceProvider中,我有以下内容:

代码语言:javascript
复制
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);
}

在我看来,我有:

代码语言:javascript
复制
@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 }}返回一个集合,例如:

代码语言:javascript
复制
[{"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、路径等所有更改除外。

{{ $article->images->path }}返回错误“正在尝试获取非对象的属性”。我如何在我的routeserviceprovider中编写代码,使它只获得一个图像而不是一个集合,这样我就可以使用{{ $article->images->path }}而不会出现错误?

EN

回答 2

Stack Overflow用户

发布于 2015-10-26 06:12:10

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

票数 1
EN

Stack Overflow用户

发布于 2015-10-26 17:16:06

我从来没有真正用RouterServiceProvider的方式做过,不确定规则是否和Controller的一样。无论如何,“尝试获取非对象的属性”错误表明Laravel认为来自$article->images的图像不是对象,因此,如果将其解码为数组,那么就可以将数组的成员作为对象进行访问。也许下面的内容会给你的问题的解决方案带来一些启发。

在控制器中:

代码语言:javascript
复制
    return View::make('pages.blog')
       ->with('images', json_decode($article->images));

下面是我是如何产生这种想法的。

代码#1:

代码语言:javascript
复制
<?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);

输出:

代码语言:javascript
复制
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:

代码语言:javascript
复制
foreach($articles as $article) {
    echo "article(" . $article->id . "): " . $article->path . "\n"; 
}

输出:

代码语言:javascript
复制
article(17): img/image2.jpg.jpg
article(23): img/image23.jpg.jpg
article(11): img/image11.jpg.jpg
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33335224

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档