2个外键1个创建刀片

Posted

技术标签:

【中文标题】2个外键1个创建刀片【英文标题】:2 foreign keys one create blade 【发布时间】:2020-06-01 02:48:23 【问题描述】:

我认为这很容易,但我的大脑并没有试图理解它。所以问题是我有一个系列表、一个季节表和一个剧集表。 我创建一个系列,然后我通过选择一个系列来创建一个季节,然后我通过首先选择一个系列然后是季节来创建剧集。 我被困在剧集部分。我想要的是,当我选择一个季节时,下拉表中只有与该系列相关的系列。我可以就如何解决这个问题获得一些帮助。 另外,在我的剧集表中,我确实有 season_id 和 episode_id。 这是我为剧集创建的刀片:

@extends('layouts.admin')

@section('content')
<div class="col-12">
    <div class="card">
        <div class="card-header">
            <h1 class="card-title">
                Create Episode
            </h1>
        </div>
        <div class="card-body">
            <form action="route('episodes.store')" method="post" enctype="multipart/form-data">
                @csrf

                <div class="form-group">
                    <label for="series_id">Series</label>
                    <select class="form-control" name="series_id">
                        @foreach ($series as $series)
                            <option value="$series->id">$series->name</option>
                        @endforeach
                    </select>
                </div>
                 <div class="form-group">
                    <label for="season_id">Seasons</label>
                    <select class="form-control" name="season_id">
                        @foreach ($seasons as $seasons)
                            <option value="$seasons->id">$seasons->name</option>
                        @endforeach
                    </select>
                </div>
                
                <div class="form-group">
                    <label for="name">Name</label>
                    <input type="text" class="form-control" name="name" id="name">
                </div>
                <div class="form-group">
                    <label for="about">About</label>
                    <textarea name="about" id="" class="form-control" cols="30" rows="10">About</textarea>
                </div>
                <div class="form-group">
                    <label for="subtitle">Subtitle</label>
                    <input type="text" class="form-control" name="subtitle">
                </div>
                <div class="form-group">
                    <label for="serno">Serial Number</label>
                    <input type="text" class="form-control" name="serno">
                </div>
                <div class="row">
                    <div class="col-md">
                        <div class="form-group">
                            <label for="subtitle">URL 1</label>
                            <input type="text" class="form-control" name="subtitle">
                        </div>
                    </div>
                    <div class="col-md">
                        <div class="form-group">
                            <label for="subtitle">URL 2</label>
                            <input type="text" class="form-control" name="subtitle">
                        </div>
                    </div>
                    <div class="col-md">
                        <div class="form-group">
                            <label for="subtitle">URL 3</label>
                            <input type="text" class="form-control" name="subtitle">
                        </div>
                    </div>
                </div>
                
                    <label for="image">Image</label>
                    <input type="file" name="image" class="form-control">

                <button type="submit" class="btn btn-primary">Save</button>
            </form>
        </div>
    </div>
</div>
@endsection

这里是创建函数:

public function create()
    
        $seasons = Season::all();
        $series = Series::all();
        return view('admin.episodes.create', compact('seasons', 'series'));
    

现在我想对这个系列做点什么,我从 Season::all 中选择季节,然后从我选择的季节中显示系列。 编辑: 这是我的迁移的样子: 系列:

Schema::create('series', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->string('name');
            $table->string('slug');
            $table->string('about');
            $table->string('image');
            $table->timestamps();
        );

季节:

Schema::create('seasons', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->integer('series_id');
            $table->string('name');
            $table->string('slug');
            $table->string('subtitle');
            $table->string('about');
            $table->string('image');
            $table->integer('serno');
            $table->timestamps();
        );

剧集:

Schema::create('episodes', function (Blueprint $table) 
            $table->bigIncrements('id');
            $table->integer('series_id');
            $table->integer('season_id');
            $table->string('name');
            $table->string('slug');
            $table->string('subtitle');
            $table->string('about');
            $table->string('image');
            $table->integer('serno');
            $table->string('url');
            $table->string('url2');
            $table->string('url3');
            $table->string('medium');
            $table->string('medium2');
            $table->string('medium3');
            $table->timestamps();
        );

【问题讨论】:

你的桌子怎么样? @ZeroOne 我已更新问题以包括我的迁移 【参考方案1】:

一个系列有多个季节。因此,在创建新剧集时,您需要一个相关的季节下拉菜单。您可以使用 ajax 请求来加载相关的下拉选择数据。当一个系列被选中时,一个请求将通过并返回该系列的季节。

所以从表格开始

<div class="form-group">
    <label for="series_id">Series</label>
    <select class="form-control" name="series_id" id="series_id">
        @foreach ($series as $series)
            <option value="$series->id">$series->name</option>
        @endforeach
    </select>
</div>
<div class="form-group">
    <label for="season_id">Seasons</label>
    <select class="form-control" name="season_id" id="season_id">
        <option value="">Select</option>
    </select>
</div>

脚本部分

<script src="https://code.jquery.com/jquery-3.4.1.min.js"
  integrity="sha256-CSXorXvZcTkaix6Yvo6HppcZGetbYMGWSFlBw8HfCJo="
  crossorigin="anonymous"></script>
<script>
    $('#series_id').change(function()
        var id = $(this).val();
        var url = ' route("getSeasons", ":id") ';
        url = url.replace(':id', id);

        $('#season_id').find('option').not(':first').remove();
        $.ajax(
           url: url,
           type: 'get',
           dataType: 'json',
           success: function(response)
               var len = 0;
               if(response != null)
                   len = response.length;
               
               else 
                   alert('sorry, no seasons were found for this series');
               
               if(len > 0)
                   for(var i=0; i<len; i++)
                       var id = response[i].id;
                       var name = response[i].name;
                       var option = "<option value='"+id+"'>"+name+"</option>"; 
                       $("#season_id").append(option); 
                   
               
            
        );
    );
</script>

web.php 文件中的路由

Route::get('getseasons/id', 'YourController@getSeasons')->name('getSeasons');

和控制器代码

public function getSeasons($id=0)
    $data = Season::where('series_id',$id)->get();
    return response()->json($data);

有什么不懂的可以问:)

【讨论】:

不错!还有一件事,我已经有了一个控制器,如何在其中加入 json 响应?我在上面的问题中提到了特定的控制器 在控制器中加入 json 响应是什么意思?? 我的意思是我已经有一个系列变量正在使用 create 函数传递给路由,第二个路由不会搞砸吗?

以上是关于2个外键1个创建刀片的主要内容,如果未能解决你的问题,请参考以下文章

创建具有主键和2个外键的表

如何在 SQL Server 的表中添加 2 个外键?

Laravel - 从刀片视图中的模型关系中检索属性

刀片计算机学习资料:3U VPX i7 刀片计算机

具有 2 个外键实体框架的表

HP C7000刀片服务器实战2:RAID1创建