Laravel - 在数据库视图中显示数组/字符串对象

Posted

技术标签:

【中文标题】Laravel - 在数据库视图中显示数组/字符串对象【英文标题】:Laravel - Display Array/String Object in view from database 【发布时间】:2018-09-04 18:29:42 【问题描述】:

数据在数据库中存储为["item_1", "item_2"],如下所示。

我想在视图刀片中正确显示这些数据。

产品型号

protected $fillable = ['name', 'prod_id'];
public function models() 
    return $this->hasMany(Model::class, 'prod_id');

模型模型

protected $fillable = ['model', 'prod_id'];
protected $cat = ['model'=>'array'];
public function model()

 return $this->belongsTo(Product::class, 'prod_id');

控制器 - 存储方法

public function create (Request $request, Product $product)
$models = new Model;
    
     $model = json_encode(request('models'));
     $items->models = $model;
     $product->models()->save($models);
    

控制器显示方法

public function show(request $id)
 $product = Product::findorfail($id);
 $models = Model::with(['model'])->where('prod_id', $product->id)->get();
 return  view ('show',  compact('product', 'models'));

创建视图

<input type="checkbox" name="model[]" value="Samsung">
<input type="checkbox" name="model[]" value="Nokia">
<input type="checkbox" name="model[]" value="Apple">
<button>Add Model</button>

我试过显示视图:

@foreach($models as $model)
   json_decode($model->models) 
@endforeach

它抛出

htmlspecialchars() 期望参数 1 是字符串,给定数组

我错过了什么。

PS:mysql 不支持 json 列,所以我保存为 text 列。

【问题讨论】:

$models 的输出是什么? 您提供的控制器代码没有任何意义。这似乎是一个复制/粘贴错误。请更正问题。 @Nawin 它的``"id":18,"prod_id":22,"models":"id":22,"user_id":1,``` @patricus 更新了 show 方法。 【参考方案1】:

你的模型模型让我有点困惑。您似乎有一个字段名称 model 与关系方法名称相同。这意味着无论何时包含该关系,它都会在功能上使用相关表中的数据覆盖该属性。 (我说“功能性”是因为您使用的是动态属性,而实际上可以明确地告诉 Eloquent 是否需要一个属性或关系,而无需猜测。)

也就是说,您的 $model-&gt;models 属性可能出于以下两个原因之一作为数组返回。首先是它可能不小心引用了关系数据集,而不是您期望的 JSON 字符串。第二个是您已将protected $cat = ['model'=&gt;'array']; 更正为protected $cast = ['models'=&gt;'array'];,现在它正在踩到您的脚趾。通过将其转换为一个数组,它可能会在您调用json_decode 之前自动被解释回一个

无论哪种方式,我都会先dd($model-&gt;models) 看看它是什么。

【讨论】:

dd($models-&gt;models) 显示模型数组 Collection #209 ▼ #items: array:1 [▼ 0 =&gt; "["Samsung","Nokia","Apple"]" ] 。嵌套的“foreach”循环已解决。 $models = Model::with(['model'])-&gt;where('prod_id', $product-&gt;id)-&gt;get();的采集结果。这是一个多对一的关系,对吧?将get 替换为first Property [models] does not exist on this collection instance. 我的错,我认为你第一次使用嵌套循环就做对了。【参考方案2】:

你需要做这样的事情。

模型模型

protected $fillable = ['models', 'prod_id']; // screenshot says that the field name is "models"

protected $cast = ['models' => 'array']; // the property is $cast no $cat  

public function product()

 return $this->belongsTo(Product::class, 'prod_id');

ModelController - 存储方法

public function store (Request $request)  

  $product = Model::create([
    'models' => json_encode($request->models),
    'prod_id' => $request->prod_id
  ]);  

  return redirect()->back()->with('success', 'created!');


public function show(Request $id)

  $model = Model::findOrFail($id)->with('product');

  return  view ('model.show',  compact('model'));

ProductController显示方法

public function show(request $id)
 $product = Product::findOrFail($id)->with('models'); // the method name is findOrFail() no findorfail 
 // $models = Model::with(['model'])->where('prod_id', $product->id)->get();
 return  view ('show',  compact('product'));

进入节目视图

@foreach($product->models as $models)
  @foreach(json_decode($models->models) as $model)
     $model 
  @endforeach
@endforeach

【讨论】:

我应该怎么做才能为多个字段实现相同的效果?像prod_idmodel_name 一样在单个列中传递 json/array,就像上面对 size 所做的那样? 在此链接中查看我的答案。我想这就是你问题的答案。 ***.com/questions/49269528/…。如果没有提出新问题,我会再次尝试帮助您 我有 3 个字段 name, address, profile_photo。这是新问题:https://***.com/questions...【参考方案3】:

你需要像这样改变你的 foreach:

@foreach($models->models as $model)
   json_decode($model) 
@endforeach

因为你的数组是这样的

"id":18,"prod_id":22,"models":"id":22,"user_id":1

在这里$models 只得到idprod_id models 仍然是数组,所以你的foreach 应该是@foreach($models-&gt;models as $model)

示例代码在这里:

$arr = '"id":18,"prod_id":22,"models":"id":22,"user_id":1';
echo '<pre>';
foreach (json_decode($arr->models) as $str)
    echo $str;

【讨论】:

以上是关于Laravel - 在数据库视图中显示数组/字符串对象的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8:在刀片视图上过滤/显示数据,数组保存在数据库中

使用 Javascript 在 Laravel 刀片视图中显示数组中的动态数据时出现问题

Laravel - 在视图中显示我的数组图像,这些图像存储在我的数据库中的一行中

Laravel(4.1.24)将查询输出传递给视图时数组到字符串的转换

Laravel 5 从数据库结果中形成另一个数组

在 Laravel 视图中传递数组值