【问题标题】:How to add multiple field of AutoComplete with Laravel 5.2如何使用 Laravel 5.2 添加 AutoComplete 的多个字段
【发布时间】:2016-11-26 04:44:42
【问题描述】:

我是 Laravel 5.2 的新手,我想使用自动完成功能创建用户搜索,以添加许多用户来使用文章或其他内容。 现在我找到了一些自动完成的例子,这很好。 但我想添加另一个搜索字段以添加另一个用户并为该文章的每个用户选择角色。

请帮助我找到解决方案或一些建议以使其成为可能。 谢谢。

这是我的代码

index.blade.php

{{ Form::open(['action' => ['SearchController@autocomplete'], 'method' => 'GET']) }} {{ Form::text('q1', '', ['id' => 'q1', 'class' => 'form-control', 'style' => 'width:250px', 'placeholder' => 'Search users']) }} {{ Form::close() }}

JS

<script>
$(function()
{
     $( "#q1" ).autocomplete({
      source: "{{ url('search/autocomplete') }}",
      minLength: 3,
      select: function(event, ui) {
//      $('#q').val(ui.item.value);
          event.preventDefault()
                $('#q1').val(ui.item.name);
      }//end select
    }).autocomplete("instance")._renderItem = function (ul, item) {
            return $("<li>")
                    .append("<a>" + item.name + " : " + item.email + "</a>")
                    .appendTo(ul);
        };
});
</script>

搜索控制器

class SearchController extends Controller
{
    public function autocomplete(){
    $term = Input::get('term');

    $results = array();

    $queries = DB::table('users')
        ->where('name', 'LIKE', '%'.$term.'%')
        ->orWhere('email', 'LIKE', '%'.$term.'%')
        ->take(10)->get();

    foreach ($queries as $query)
    {
        $results[] = [ 'id' => $query->id, 'name' => $query->name, 'email' => $query->email ];
    }
    return Response::json($results);
    }

}

更新架构 现在它仍然是一个草稿,不确定详细字段。 但我想我有一些像这样的表

用户表 > 用于存储的用户 ID 和用户名等。

Exam Table> 用于存储examID 等...(此表用于创建examID 以添加许多用户进行测试并存储userID、examID 到坐标表)

坐标表(坐标模型)> 用于存储考试 ID 以及所有用户 ID 和 userRole 已由您的代码接收并具有类似的字段 下面(角色可能更改为 textNOTE)
编号 |考试编号 |用户 ID |角色

【问题讨论】:

  • 您能否详细说明这两个搜索字段的用途?我无法得到它。
  • @jaysingkar 这意味着我可以使用自动完成搜索用户,当我找到并选择该用户时,我必须从选择框中选择用户角色,然后我提交将该用户和用户角色添加到数组中它一次又一次地向数据库添加许多用户和角色。我的英语不好,很抱歉。
  • 哪个控制器将处理您的添加用户角色请求?
  • 检查我的答案,让我知道它是否有效。我无法提供完整的工作代码,因为我不知道您的剩余代码。

标签: php jquery search autocomplete laravel-5.2


【解决方案1】:

据我了解,您希望在不刷新页面的情况下重复添加用户及其角色。假设是这种情况,您可以按照以下步骤操作。

注意:下面的代码是阐明这些步骤的最小说明。

角色模型:-(存储在 App\Models 目录中)(假设您有不同的角色表)

<?php    
namespace App\Models;

use Illuminate\Foundation\Auth\User as Authenticatable;

class Role extends Model
{
    protected $fillable = ['role'];

    public function User(){
      return $this->belongsTo('App\Models\User');
    }
}

用户控制器:-(存储在 App\HTTP\Controllers 目录中)
处理添加请求并在数据库中插入数据

<?php

namespace App\Http\Controllers;
use App\Models\User;
use App\Models\Role;

use Illuminate\Http\Request;
use DB;

class userController extends Controller
{

    public static function addRole(Request $request)
    {
         User::where('id',$request->user_id)
               ->Role()
               ->create($request->only(['role']));        
        }
    }

添加路由来处理请求:-

Route::post('/add/user', array('uses' => 'userController@addUser'));

在您的视图中添加一个将添加用户的表单:

{{ Form::open(['action' => ['userController@addUser'], 'method' => 'POST','id'=>'add_role_form']) }}
   {{ Form::hidden('id', '', array('id' => 'id','class' => 'form-control')) }}
   {{ Form::text('name', '', ['id' =>  'name', 'class' => 'form-control', 'placeholder' =>  'Search users','disabled' => 'disabled']) }}
   {{ Form::select('role', array('admin' => 'Admin', 'Editor' => 'Editor'),['id' =>  'role', 'class' => 'form-control']); }}
{{Form::button('Click Me!','id' =>  'addRole', 'class' => 'btn btn-primary','obclick'=>'addRole();'])}}
    {{ Form::close() }}

JS 使用 ajax 添加用户角色:

<script>
function addRole(){
$('#add_role_form').preventDefault()
        $.ajax({
            type: "POST",
            url: $('#add_role_form').attr('action'),
            data: $('#add_role_form').serialize(),
            cache: false,
            success: function(result){
                // Do something
            },
            error: function (result) {
                // Do something
            }
        });
    }
</script>

PS:请添加一个JS脚本将所选用户的user_id分配给#add_role_form中的隐藏id。

更新:

HTML

<html>
    <head>
        <title>Test Form</title>

        <script src="js/jquery-2.2.4.js"></script>

        <script src="js/jquery.autocomplete.js"></script>

        <script>
            $(document).ready(function () {
                console.log($('#userForm input:last'));
                var user = Array('User1','User2','User3','User4','User5','User6');<!-- User data. Not required if serviceUrl option is provided-->
                $('#user').autocomplete({
                    lookup: user, <!-- Use user variable as data source. Not required if serviceUrl option is provided for ajax request -->
                    tabDisabled:true,
                    showNoSuggestionNotice:true,
                        onSelect: function (suggestion) {
                    }
                });
                var role = Array('Role1','Role2','Role3','Role4','Role5','Role6');<!-- Role data. Not required if serviceUrl option is provided-->
                $('#role').autocomplete({
                    lookup: role, <!-- Use role variable as data source. Not required if serviceUrl option is provided for ajax request -->
                    tabDisabled:true,
                    showNoSuggestionNotice:true,
                    onSelect: function (suggestion) {
                    }
                });
            });
            var count = 0; <!-- Counter to keep track of elements i.e. user->role pairs -->
            function add(){<!-- Function to insert user and role pair as input to form -->
                $('#userForm input:last')
                        .before($('<label>')
                                .attr('for','data['+count+'][user]')
                                .text('User')
                        )
                        .before($('<input>')
                                .attr('type', 'text')
                                .attr('name','data['+count+'][user]')
                                .val($('#user').val())
                        )
                        .before($('<label>')
                                .attr('for','data['+count+'][role]')
                                .text('Role')
                        )
                        .before($('<input>')
                                .attr('type', 'text')
                                .attr('name','data['+count+'][role]')
                                .val($('#role').val())
                        )
                        .before($('<hr>'));
                count=count+1;
            }
        </script>

        <link media="all" type="text/css" rel="stylesheet" href="css/bootstrap.css">

        <link media="all" type="text/css" rel="stylesheet" href="css/font-awesome.css">

    </head>
    <body class="container">
    <div class="row"> 
        <div class="col-lg-6">
                <input type="text" id="user" class="form-control" placeholder="Search User" /><!-- User search field -->
        </div>
        <div class="col-lg-4">
                <input type="text" id="role" class="form-control" placeholder="Search Role" /><!-- Role search field. You can use Dropdown list instead of Input -->
        </div>
        <div class="col-lg-2">
            <a class="btn btn-info" onclick="add();">Add User</a> <!-- Button to add user -> role pair to form -->
        </div>
    </div>


    <form method="post" id="userForm" action="http://127.0.0.1/public/test"> <!-- user data form. This is going to be submited to server-->
        <input type="submit" name="submit" class="btn btn-primary"/>
    </form>

    </body>
</html>

路线

// To get Form
Route::get('test',function (){
    return View::make('test');
});

// To handle Form
Route::post('test',function (Request $request){
    var_dump($request->all());
});

var_dump 输出:

array (size=1)
  'data' => 
    array (size=5)
      0 => 
        array (size=2)
          'user' => string 'User1' (length=5)
          'role' => string 'Role1' (length=5)
      1 => 
        array (size=2)
          'user' => string 'User1' (length=5)
          'role' => string 'Role1' (length=5)
      2 => 
        array (size=2)
          'user' => string 'User1' (length=5)
          'role' => string 'Role1' (length=5)
      3 => 
        array (size=2)
          'user' => string 'User1' (length=5)
          'role' => string 'Role1' (length=5)
      4 => 
        array (size=2)
          'user' => string 'User1' (length=5)
          'role' => string 'Role1' (length=5)

更新 2:

Coordinate 是您的模型实例。我正在考虑将ID 作为自动增量。

public function add(Request $request){
    $data = $request->data;
    foreach ($data as $key=>$value){        
        $data[$key]['exam_id'] = unique();//Inserting exam id into your received data
    }

    Coordinate::create($data);
}

【讨论】:

  • 你的回答很好。我理解它但它仍然不能解决我的问题。因为我想找到具有自动完成功能的用户,然后我就可以做到。并且可以使用 JavaScript 存储可搜索的内容。每次我找到一个用户时,我都必须为已选择的用户选择角色。而现在我想我会将用户和用户的角色保留在 JavaScript 中的二维数组中。但我不知道如何发送数组中的数据以提供要保存到数据库的模型。
  • 只是想了解一下,您想一次将用户和角色列表发送到服务器而不是 ajax 方法?
  • 就像您知道列数但不知道行数一样。正确的 ?即用户和角色是您的列,具有角色的用户数是您的行。
  • 没错。 @jaysingkar 或者你有更好的方法来存储数据,请告诉我该怎么做?非常感谢您花时间帮助我。
  • 感谢更新,现在,如何使用某种模型将其存储在数据库中(发送到控制器的数据格式是什么?如果它将数据数组发送到控制器以存储到数据库. 如何读取存储每一行​​的数据?)
猜你喜欢
  • 2016-12-03
  • 1970-01-01
  • 1970-01-01
  • 2016-11-07
  • 2016-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-09
相关资源
最近更新 更多