Laravel - 从数据库

时间:2018-03-26 14:51:03

标签: arrays json laravel eloquent query-builder

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

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

Items Model

产品型号

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列,所以我保存为文本列。

3 个答案:

答案 0 :(得分: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 show method

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

答案 1 :(得分:2)

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

也就是说,由于两个原因之一,您的$model->models属性可能会以数组的形式返回。第一个是它可能意外地引用了关系数据集而不是您期望的JSON字符串。第二个是你已经更正了protected $cat = ['model'=>'array'];来阅读protected $cast = ['models'=>'array'];,现在它正在踩到你的脚趾。通过将其强制转换为数组,可能会在上调用json_decode之前自动将其解释回一个

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

答案 2 :(得分:0)

你需要像这样改变你的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->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;
}