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->models
属性可能出于以下两个原因之一作为数组返回。首先是它可能不小心引用了关系数据集,而不是您期望的 JSON 字符串。第二个是您已将protected $cat = ['model'=>'array'];
更正为protected $cast = ['models'=>'array'];
,现在它正在踩到您的脚趾。通过将其转换为一个数组,它可能会在您调用json_decode
之前自动被解释回一个。
无论哪种方式,我都会先dd($model->models)
看看它是什么。
【讨论】:
dd($models->models)
显示模型数组 Collection #209 ▼ #items: array:1 [▼ 0 => "["Samsung","Nokia","Apple"]" ]
。嵌套的“foreach”循环已解决。
$models = Model::with(['model'])->where('prod_id', $product->id)->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_id
、model_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
只得到id
和prod_id
models
仍然是数组,所以你的foreach 应该是@foreach($models->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 - 在视图中显示我的数组图像,这些图像存储在我的数据库中的一行中