【问题标题】:Laravel 5: Article hasMany Image, Image belongsTo Article. Getting a collection backLaravel 5:文章有很多图片,图片属于文章。收回收藏品
【发布时间】:2015-10-26 17:28:01
【问题描述】:

当我创建一篇文章时,我可以附加一张图片作为缩略图。一切正常,图片上传到 img 目录,图片路径添加到 images 表中,并且 images 表中的 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-&gt;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-&gt;images-&gt;path }} 返回错误“尝试获取非对象的属性”。如何在我的 routeserviceprovider 中编写代码,以便它只获取一张图像而不是一个集合,这样我就可以使用{{ $article-&gt;images-&gt;path }} 而不会出错?

【问题讨论】:

    标签: php laravel laravel-5


    【解决方案1】:

    如果您的文章每篇有 1 张图片,请使用 hasOne()。如果您的文章可以有超过 1 个图像,那么您需要遍历每个图像(集合)以获取它们的路径,或使用 -&gt;first()... 或编写一个自定义方法,根据它的任何标准返回 1 个图像必须见面。

    【讨论】:

    • 啊 hasOne 而不是 hasMany,现在我在使用 $article->images 时没有得到集合,而只是一个对象。 $article->images->path 应该指向 path 属性,但仍然出现“尝试获取未定义属性”错误.. =S
    【解决方案2】:

    我从来没有真正做到过RouterServiceProvider 方式,不确定规则是否与Controller 方式相同。无论如何,“试图获取非对象的属性”错误表明 Laravel 认为来自$article-&gt;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
    

    【讨论】:

    • 感谢您的帮助。 RouteServiceProvider 用于路由模型绑定。它允许我在控制器方法中输入提示内容,因此我不必重复 $article = Article::findOrFail($id);等等。然而,我发现我做错了什么。首先,我使用了错误的关系。应该使用 hasOne 而不是 hasMany。其次,我的迁移文件缺少一行,图像表中的“article_id”未设置为无符号,因此尝试访问它会出现错误,即使集合仍然存在。修复错误后,不再收集。
    猜你喜欢
    • 1970-01-01
    • 2018-04-26
    • 2017-01-12
    • 1970-01-01
    • 2015-06-03
    • 2017-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多