通过索引 Laravel 5 从集合中获取项目

Posted

技术标签:

【中文标题】通过索引 Laravel 5 从集合中获取项目【英文标题】:Get item from collection by index Laravel 5 【发布时间】:2017-05-28 11:17:33 【问题描述】:

我需要将多张图片上传到服务器。如果数据库更新名称中存在图像,则上传新的。否则在数据库中创建新记录。 脚本我已上传新图片但不更新现有图片。

if ($request->hasFile('images')) 
    foreach ($request->file('images') as $key => $image) 
        $filename = time() . $image->getClientOriginalName();
        $image->move('img/products', $filename);

        if (isset($product->images[$key])) 
            $result = $product->images[$key]->update([
                'name' => $filename
            ]);
            dd($result);
         else 
            $product->images()->create([
                'name' => $filename
            ]);
        
    

【问题讨论】:

您也应该显示您的输入表单,以便我们了解即将到来的请求类型 $product 是什么或者如何用集合填充它? 输入类型文件。还有什么? 产品和图像之间有什么关系?您使用数组键获得产品的图像,这是不正确的。 产品有很多图片,图片属于产品 【参考方案1】:

应该是这样的

if ($request->hasFile('images')) 
        foreach ($request->file('images') as $key => $image) 
            $filename = time() . $image->getClientOriginalName();
            $image->move('img/products', $filename);

             $product->images->updateOrCreate(['id' => $key], ['name' => $filename]);
        
    

请不要说我假设 $key 是 id iamges 意味着您的输入应该这样命名

<imput name="images['Id_of_image_in_databse']" type="file" />

【讨论】:

这就是为什么我首先要求您提供表单代码【参考方案2】:

使用updateOrCreate() 方法而不是整个if ... else 子句:

$product->images->updateOrCreate(['id' => $key], ['name' => $filename]);

【讨论】:

是输入文件的索引,不是id 键是输入的数量,如果使用了第二个输入 - 更新数据库中的第二个图像 @NgoliChiganu 在您的代码中,您将$key 用作id。如果不是身份证,身份证是什么?如果你没有,你想知道这个文件是否已经存在于数据库中? 你傻吗??我告诉过你 $key 是输入索引,我可以使用 $product->images[$key] 获取图像,但它拒绝更新它。 @NgoliChiganu 我认为你甚至不知道基本的编码,你正在使用 laravel 并说某人很愚蠢,而你很愚蠢,不知道如何管理一个简单的表单【参考方案3】:

首先你需要确定代码结果,将下面的代码放在if ($request-&gt;hasFile('images')) 行之前:

print('<pre style="color:red;">Uploaded image:: ');
print_r($request->file('images'));
print('</pre>');


print('<pre style="color:red;"> Product Image:: ');
print_r($product->images);
print('</pre>');
exit;

这不是答案的一部分!所以让我知道上面代码的结果。

【讨论】:

【参考方案4】:

您还可以使用 laravel 必须的美妙集合方法来检查集合是否包含特定项目/键。请查看https://laravel.com/docs/5.3/collections#method-get 以从集合中按键检索项目。如果项目不存在,则返回 null。您可以进行类似的检查

if(null !== $product->images()->get($key))
    // update
    // remove old image
 else 
    // create

您还可以在更新方法中从服务器中删除旧图像。

【讨论】:

以上是关于通过索引 Laravel 5 从集合中获取项目的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Laravel 集合中元素的索引

忘记不修改原始集合 Laravel 5.7

如何在不重新索引的情况下将项目添加到 laravel 列表集合中?

从 Laravel 集合中获取单个模型

Laravel - 渴望加载多对多,仅获取一条记录(不是集合)

如何从 Laravel 的集合中计算不同的值?