【问题标题】:How to pass input request to foreach loop in controller to store data如何将输入请求传递给控制器​​中的 foreach 循环以存储数据
【发布时间】:2019-09-01 17:27:30
【问题描述】:

我正在使用 laravel 构建一个具有本地化功能的网站。尝试使用表单以 3 种语言存储名称和文本。每篇文章我都有一个模型,文章翻译还有一个模型。 使用名称和文本的输入,输入名称如 name_en、text_en、name_de、text_de 等... 但我不知道如何将输入值传递给控制器​​中 store 方法中的 foreach 循环。

我尝试将 (Request $request) 对象传递到 foreach 循环中,但它返回错误。代码如下:

public function store(Request $request)
{
    $test = new Test;
    $test->isActive = true;
    $test->save();

    //TRANSLATED INPUTS = name_tr,text_tr,name_en,text_en,name_de,text_de

    foreach (['tr', 'en', 'de'] as $locale => $request)//OBVIOUSLY WRONG 
    {
        $test->translateOrNew($locale)->name = $request->input('name_'.$locale);
        $test->translateOrNew($locale)->text = $request->input('body_'.$locale);
    }

    $test->save();
    dd($test);
    //echo 'Created new article with some translations!';
}

试图从数据库中获取翻译后的输入。

【问题讨论】:

  • foreach 已经可以通过依赖注入访问$request,您根本不需要将其作为值包含在您的foreach 块中

标签: laravel foreach controller request


【解决方案1】:

可以按照您设置的方式执行此操作。您可以使用一系列 if str contains,然后在 nametext 上使用 str replace,直到您获得正确的语言。但是,如果您的表单中有许多名称和文本(我假设您这样做是因为需要在传入数据上使用 foreach),那么这可能需要大量工作并且可能会非常混乱。

我建议您稍微修改表单以返回更多信息。考虑以下可能从表单返回的元素:

  1. 姓名[]
  2. 文本[]
  3. 语言[]

然后,在您的 store 方法中,您可以通过多种方式遍历其中的每一个,但为了解释,我将使用最清晰的(虽然不是最有效的):

设置索引:

$i = 0;

遍历所有表单的返回,并获取名称附带的相应文本和语言(通过相同的索引):

foreach($request->get('name') as $name){
     $lang = $request['language'][$i];
     $test->translateOrNew($lang)->name = $name;
     $test->translateOrNew($lang)->text = $request['text'][$i];
     $i ++;
}

这几乎是伪代码,您必须进行重构以使其适合您,但它应该让您了解如何执行此操作。您需要验证用户提供的每个集合(名称、文本、语言)是否完整,否则索引将失败。

【讨论】:

  • 感谢您的建议。我采用了一种不同的方法,我没有使用循环,而是为每种语言使用了一个“硬编码”多维数组,并将它们存储在一个变量中,然后保存。
  • 不用担心,很高兴您解决了问题。是的,有几种方法可以使这项工作:)
猜你喜欢
  • 1970-01-01
  • 2017-06-24
  • 2018-03-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 2015-06-11
  • 1970-01-01
相关资源
最近更新 更多