Laravel 5 - 编辑页面中的设计和数据问题

标签 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 中,我会为 Food and Drink 选择 2,然后在出现的文本框中输入 Some input(除了留空的那个)。 我会选择 Dynamic 并选中 Pizza、Lemonade 和 Other 复选框。在其他复选框的文本区域中,我输入了 dfsdfsdfsdf (所以对于另一个复选框,我感兴趣的是文本框数据而不是复选框值)。

关于我的模型,一个 CampaignCreatives 可以有很多 CampaignCreativesData。因此,事物的创造方面的一切都很好。 编辑页面出现问题,看到很多显示是动态的。我通过这个查看

$campaignCreative = CampaignCreatives::where('campaignId', '=', $campaign->id)->first();

我使用 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。因此,我需要为这些显示的文本输入及其值。 我将如何着手做这样的事情?

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

非常感谢

最佳答案

首先,我将更改您存储标签的方式,这样您就可以不再使用 Food1、Food2、Food3 等 只要有'食物'。这样,您可以为每个 CampaignCreatives 提供许多 Foods

这将允许您在 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这样您就可以更好地了解如何有效地建模数据。

希望这对您有所帮助,如果您认为它充分回答了您的问题,请不要忘记将其标记为答案。

关于Laravel 5 - 编辑页面中的设计和数据问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35584874/

相关文章:

php - 如何使用 `created_at` 列获取最新数据

php - Laravel Eloquent 困难关系查询

php - Laravel 5.8 自定义表单请求未按预期工作?

php - 从请求中排除 Laravel 特定的值

php - 拉维尔 5 : check if user belongs to the moderators list before allowing him to edit

php - Laravel 全局作用域和连接

php - 如果用户具有 softdelete 属性,Laravel 5.1 Auth::attempt() 不工作

php - Laravel 社交名流 Google 登录在本地环境中失败并出现 401

Laravel 响应函数只返回 200?

laravel - 带有 Laravel 的 Postgresql : Filter Json field with substring