我的编辑页面有问题,我不太确定是否属于我的数据库设计。 我已经设置了以下JSFiddle来演示我的创建表单
现在我的第一个架构从该页面捕获简单信息,基本上只是选择单选按钮的值 和日期输入。
Schema::create('campaign_creatives', function(Blueprint $table)
{
$table->increments('id');
$table->string('templateOptions')->default('')->nullable();
$table->date('arrival')->nullable();
$table->timestamps();
});
现在,如果您从其中一个选择框中选择一个数字,您将看到显示的文本输入数量。它是 我对此感兴趣的数据。此外,如果选择动态单选按钮,则会显示其他输入。 此外,如果选择“其他”,则会出现一个文本区域以提供更多详细信息。所以我想要一种方法来捕获所有这些 信息,我创建了下表
Schema::create('campaign_creatives_data', function(Blueprint $table)
{
$table->increments('id');
$table->string('name')->default('')->nullable();
$table->string('label')->default('')->nullable();
$table->longText('value')->default('')->nullable();
$table->integer('campaignCreativesId')->unsigned()->default(0);
$table->foreign('campaignCreativesId')->references('id')->on('campaign_creatives')->onDelete('cascade');
$table->timestamps();
});
名称代表我捕获的东西,而标签和值代表输入标签和值。 毕竟,当我保存数据时,它看起来有点像下面的
campaign_creatives
+----+--------------+-----------------+------------+---------------------+---------------------+
| id | campaignType | creativeArrival | campaignId | created_at | updated_at |
+----+--------------+-----------------+------------+---------------------+---------------------+
| 14 | Dynamic | 2016-02-25 | 2 | 2016-02-23 15:56:43 | 2016-02-23 15:56:43 |
+----+--------------+-----------------+------------+---------------------+---------------------+
campaign_creatives_data
+----+----------------+-------------------+--------------+---------------------+---------------------+---------------------+
| id | name | label | value | campaignCreativesId | created_at | updated_at |
+----+----------------+-------------------+--------------+---------------------+---------------------+---------------------+
| 62 | creativeOption | Other | dfsdfsdfsdf | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 60 | creativeOption | checkboxSelection | Pizza | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 61 | creativeOption | checkboxSelection | Lemondade | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 59 | creativeNumber | Food2 | | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 57 | creativeNumber | Drink2 | Some input | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 58 | creativeNumber | Food1 | Some input | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
| 56 | creativeNumber | Drink1 | Some input | 14 | 2016-02-23 16:00:01 | 2016-02-23 16:00:01 |
+----+----------------+-------------------+--------------+---------------------+---------------------+---------------------+
creativeOption表示复选框,creativeNumber表示与选择数量相关的数据。所以要生产 在上面的FIddle中,我会选择2用于食物和饮料,并在出现的文本框中输入一些输入(除了一个留空)。 我会选择动态并选择比萨饼,柠檬水和其他复选框。在其他复选框的textarea中,我输入了dfsdfsdfsdf (所以对于另一个复选框,我对文本框数据而不是复选框值感兴趣。)
对于我的模型,CampaignCreatives可以有许多CampaignCreativesData。因此,创造事物的一切都很有效。 编辑页面出现问题,发现很多显示都是动态的。我通过了这个视图
$campaignCreative = CampaignCreatives::where('campaignId', '=', $campaign->id)->first();
我首先使用,因为只能有一个CampaignCreatives。在我看来,我现在可以访问上面显示的所有数据。这是一个例子。 在我的编辑页面上,我有以下代表选项数量的选项框。
<div class="form-group">
<div class="row">
<div class="col-md-12">
<h3>Number of Options</h3>
<div class="col-md-3 noPadding">
{!! Form::label('cFood', 'Food:', array('class' => '')) !!}
{!! Form::select('cFood', ['0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7'], null, ['class' => 'cSelectType']) !!}
</div>
<div class="col-md-3">
{!! Form::label('cDrink', 'Drink:', array('class' => '')) !!}
{!! Form::select('cDrink', ['0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7'], null, ['class' => 'cSelectType']) !!}
</div>
<div class="col-md-3">
{!! Form::label('cOther', 'Other:', array('class' => '')) !!}
{!! Form::select('cOther', ['0' => '0', '1' => '1', '2' => '2', '3' => '3', '4' => '4', '5' => '5', '6' => '6', '7' => '7'], null, ['class' => 'cSelectType']) !!}
</div>
</div>
</div>
</div>
根据以上数据,我知道有4个creativeNumber数据,2个用于Food,2个用于Drink。因此,我需要为这些显示的文本输入及其值。 我该如何做这样的事情?
我知道这是很多信息,如果有人能指引我走向正确的方向,我会非常感激。
非常感谢
答案 0 :(得分:2)
首先,我会改变你存放标签的方式,这样你就不用食物1,食物2,食物3等了
只需要'食物'。这样,每Foods
可以有CampaignCreatives
个。{/ p>
这将允许您在CampaignCreatives模型上添加一些其他关系以定位这些类型:
public function foods()
{
return $this->hasMany('CreativeCampaignData::class')->whereHas('type', function($query) {
$query->where('campaign_creatives_data.name', 'Food');
});
}
您可以对Drinks
和Other
执行相同操作。
然后,您可以急切地加载相关数据:
$campaignCreative = CampaignCreatives::with('foods', 'drinks', 'others')->where('campaignId', $campaign->id)->firstOrFail();
然后要生成表单,请使用:
<div class="form-group">
<div class="row">
<div class="col-md-12">
<h3>Number of Options</h3>
<div class="col-md-3 noPadding">
@foreach($campaignCreative->foods as $food)
<div class="form-group">
<label>Food {{ $food->id }}:</label>
<input type="text" name="foods[{{ $food->id }}]" value="{{ old('foods.'.$food->id, $food->id) }}" />
</div>
@endforeach
</div>
<!-- other fields here -->
</div>
</div>
</div>
我无法测试代码,因为它是在与您的应用程序的其他部分隔离的情况下编写的,但这应该可以帮助您实现您需要实现的目标。
更好的解决方案是更改存储数据的方式,并为Food
,Drink
和Other
定义模型(最后一个需要一点思考,因为其他不是这是模特的好名字。
这些数据对于应用程序域来说显然非常重要,因此应该清楚地表示它们。这也可以让你拥有更好的关系,以及以后做更复杂的报告 - 更容易。
例如,您的Campaign
型号:
public function foods() {
// You may want to model this as a many-to-many, if the food can be used with other campaigns.
return $this->hasMany(Food::class);
}
public function drinks() {
return $this->hasMany(Drink::class);
}
然后,您可以执行大量报告,例如“向我展示所有有食物但没有饮料的广告系列”:
$campaigns = CreativeCampaign::whereHas('foods')->whereDoesntHave('drinks')->get();
documentation on Eloquent relationships可能是一个有用的指南。我还建议您研究database normalization,以便更好地了解如何有效地建模数据。
希望这会有所帮助,如果您觉得它能够充分回答您的问题,请不要忘记将其标记为答案。