我有一个报告模型,如下所示。
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对象。但是,我不能在循环中创建它,因为我需要循环在我第一次创建它时返回的内容。
我不确定我有多清楚,但有什么东西可以添加到我的模型中,所以我可以阻止任何重写?或者我需要以另一种方式做到这一点吗?
由于
答案 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');
}