【问题标题】:Laravel - Store data in HasMany relationship from a multi-select formLaravel - 从多选表单中以 HasMany 关系存储数据
【发布时间】:2014-12-30 14:36:33
【问题描述】:

一个用户可以选择多个选项:

<!-- Select Multiple -->
    <div class="form-group">
      <label class="col-md-4 control-label" for="bedrooms">Bedrooms</label>
      <div class="col-md-4">
        <select id="bedrooms" name="bedrooms[]" class="form-control"
                multiple="multiple">
          <option value="1" selected="selected">Studio</option>
          <option value="2">1</option>
          <option value="3">2</option>
          <option value="4">3</option>
          <option value="5">4</option>
          <option value="6">5</option>
          <option value="7">6+</option>
        </select>
      </div>
    </div>

我想将这些变量存储在一个表中 - bedrooms,在单独的行中,以便我可以将它们包含在查询中。每个卧室都会关联criteria_id

我尝试使用 Laravel 文档中显示的 $criteria-&gt;bedrooms()-&gt;saveMany(Input::get('property_type')); 之类的查询,但没有成功 - 错误:

Argument 1 passed to Illuminate\Database\Eloquent\Relations\HasOneOrMany::save()
must be an instance of Illuminate\Database\Eloquent\Model, string given

$criteria-&gt;bedrooms()-&gt;attach(Input::get('property_type'));,但这会返回错误:Call to undefined method Illuminate\Database\Query\Builder::attach()

关系:

Criteria -

public function bedrooms()
    {
        return $this->hasMany('Bedroom');
    }

非常感谢您的帮助。

【问题讨论】:

  • 如果有错误,会产生什么错误?
  • 传递给 Illuminate\Database\Eloquent\Relations\HasOneOrMany::save() 的参数 1 必须是 Illuminate\Database\Eloquent\Model 的实例,给定字符串
  • 为什么是$criteria-&gt;properties()?不应该是$criteria-&gt;bedrooms()吗?
  • @lukasgeiter,对不起,我从错误的行复制了它。我想对我的属性表做同样的事情。

标签: php laravel laravel-4 eloquent one-to-many


【解决方案1】:

saveMany 将在这种情况下工作,您只需先将输入数组转换为一组新模型。假设你知道 Criteria ID,试试这个:

    foreach (Input::get('bedrooms') as $bedroom) {
        $selected[] = New Bedroom(['bedroom' => $bedroom]);
    }
    $criteria = Criteria::find($criteria_id)->bedrooms()->saveMany($selected);

【讨论】:

  • 感谢您的帮助@damiani。
【解决方案2】:

saveMany() 方法需要一个模型数组,而不是 id

【讨论】:

  • 我也试过attach(),它产生Call to undefined method Illuminate\Database\Query\Builder::attach()。你会建议我如何保存这个?肯定有一个简单的解决方案吗?
  • Bedroom::whereIn('id', Input::get('bedrooms'))->update(['criteria_id' => Input::get('criteria_id'));跨度>
  • 感谢您的回复。不幸的是,查询运行了,但选择的卧室没有保存到bedroom 表中。 DD(查询)返回int(0)
  • 我的意思是您可能需要修改查询...我不知道您的表单、模型和表格的整体外观。您是在卧室桌子上编辑或创建条目吗?
  • 你的代码是完美的,减去了criteria_id。我把它改成了一个变量——Bedroom::whereIn('id', Input::get('bedrooms'))-&gt;update(['criteria_id' =&gt; $criteria_id]);,这是返回int(0)的例子。
【解决方案3】:

我在视图中使用复选框:

@foreach($bedrooms as $row)
<input type="checkbox" name="bedrooms[]" value="<?php echo $row->id ?>">{{$row->name}}<br/>
@endforeach

在模型中创建 BedroomCriteria.. 像这样

class BedroomCriteria extends Eloquent {
    public function Bedroom() {
        return $this->belongsTo('Bedroom');
    }

    public function Criteria() {
        return $this->belongsTo('Criteria');
    }

}

那么控制器的保存代码是这样的

  if (isset($input["bedrooms"])) {
                foreach ($input['bedrooms'] as $check) {
                    $bedroom_criteria = array(
                        "bedroom_id" => $check,
                        "criteria_id" => $input['id']
                    );
                    $bedroom_criteria= BedroomCriteria::create($bedroom_criteria);
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-31
    • 2015-11-29
    • 1970-01-01
    • 2019-07-16
    相关资源
    最近更新 更多