将模型数据保存到数据库

时间:2016-06-02 12:03:05

标签: laravel laravel-5 laravel-5.1

我有一个报告模型,如下所示。

class Report extends Model
{
    protected $table = 'reports';
    protected $guarded = [];

    public function leadsCollection()
    {
        return $this->hasMany('App\ReportModels\LeadsCollection');
    }
}

报告可以有很多LeadsCollection,其模型如下。

class LeadsCollection extends Model
{
    protected $table = 'leadsCollection';
    protected $guarded = [];
    private $xmlElement;

    public function __construct($xmlElement = null, $attributes = array())  {
        parent::__construct($attributes);
        $this->xmlElement = $xmlElement;
    }

    public function report()
    {
        return $this->belongsTo('App\ReportModels\Report');
    }

    function asArray(){
        $reportItem = array();

        foreach($this->xmlElement->Leads->Lead as $lead) {
            $dateIdentified = date("d/m/Y", strtotime($lead->Date));

            $reportItem[] = array(
                'LeadID' => (string)$lead->ID,
                'Client' => (string)$lead->Client->Name,
                'Category' => (string)$lead->Category,
                'DateIdentified' => $dateIdentified,
                'LeadName' => (string)$lead->Name,
                'Owner' => (string)$lead->Owner->Name
            );
        }

        return $reportItem;
    }
}

现在我正在尝试将一些数据保存到数据库中。因此,我通过调用我的LeadsCollection获取所有Leads的列表,并将其传递给Leads的XML列表。 然后我循环这些Leads并将其添加到数组中。但同时我需要将它保存到数据库中。这是我到目前为止所做的。

public function getForecastReportForLeads() {
    $leads = new LeadsCollection(new \SimpleXMLElement(Helper::getCurrentLeads()));

    $reportArray = array();

    foreach ($leads->asArray() as $lead) {
        $report = new Report();
        $report->reportName = 'Lead Forecast';
        if($report->save()) {
            $leads->leadId = $lead['LeadID'];
            $leads->leadCategory = $lead['Category'];
            $leads->dateIdentified = $lead['DateIdentified'];
            $leads->leadName = $lead['LeadName'];
            $leads->owner = $lead['Owner'];
            $leads->client = $lead['Client'];
            $leads->report_id = $report->id;
            $leads->save();

            $reportItem = array(
                'leadData' => $lead
            );

            $reportArray[] = $reportItem;
        }
    }

    return $reportArray;
}

所以我创建了报告项目,如果我有7个潜在客户,我在报告表中最终得到了7个报告行,就像它应该的那样。但是,当我保存Leads时,我的leadCollection表中只有1行,其他每个条目似乎都被覆盖了。我想这是因为我没有在循环中创建Lead对象。但是,我不能在循环中创建它,因为我需要循环在我第一次创建它时返回的内容。

我不确定我有多清楚,但有什么东西可以添加到我的模型中,所以我可以阻止任何重写?或者我需要以另一种方式做到这一点吗?

由于

1 个答案:

答案 0 :(得分:1)

要么在save方法中获取变量,要么初始化新的

$report = new Report($reportItem);

$report->save($report)

我有一个类似的问题,让我展示我的代码。它适用于您的情况。我的错误是我正在更新并且plan_detail.id被移动而不是创建一个新的。但如果你创造就好了:

public function store(Request $request)
{
    $this->validate($request, [ 'title' => 'required',
                                'description' => 'required']);
    $input = $request->all();

    $plan_details = Plan_Detail::ofUser()->get();
    $plan = new Plan($request->all());

    DB::beginTransaction();
    Auth::user()->plans()->save($plan);

    try {
      foreach ($plan_details as $k => $plan_detail)
        Plan::find($plan['id'])->details()->save($plan_detail);
      DB::commit();
    } catch (Exception $e) {
      Log::error("PGSQL plan detail " . $e->message());
      DB::rollback();
      session()->flash('message', 'Error al guardar el plan de entreno');
    }

    return redirect('plans');
}