Laravel 5 - 编辑页面

时间:2016-02-23 18:00:59

标签: laravel laravel-5 laravel-5.1

我的编辑页面有问题,我不太确定是否属于我的数据库设计。 我已经设置了以下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。因此,我需要为这些显示的文本输入及其值。 我该如何做这样的事情?

我知道这是很多信息,如果有人能指引我走向正确的方向,我会非常感激。

非常感谢

1 个答案:

答案 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');
    });
}

您可以对DrinksOther执行相同操作。

然后,您可以急切地加载相关数据:

$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>

我无法测试代码,因为它是在与您的应用程序的其他部分隔离的情况下编写的,但这应该可以帮助您实现您需要实现的目标。

更好的解决方案是更改存储数据的方式,并为FoodDrinkOther定义模型(最后一个需要一点思考,因为其他不是这是模特的好名字。

这些数据对于应用程序域来说显然非常重要,因此应该清楚地表示它们。这也可以让你拥有更好的关系,以及以后做更复杂的报告 - 更容易。

例如,您的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,以便更好地了解如何有效地建模数据。

希望这会有所帮助,如果您觉得它能够充分回答您的问题,请不要忘记将其标记为答案。