在 Laravel 中使用 AJAX 与数据库交互

Posted

技术标签:

【中文标题】在 Laravel 中使用 AJAX 与数据库交互【英文标题】:Using AJAX in Laravel to interact with database 【发布时间】:2013-03-15 11:33:10 【问题描述】:

我正在学习基于模型、视图、控制器范式的 Laravel php 框架。我一直在尝试将 AJAX 合并到我的简单入门应用程序中……一个电话记录器。这是我通常放弃的地方。但我拒绝!

所以我有我的电话模型:

class Phonecall extends Eloquent

// Creates an instance of the database object 

这是我的电话表:

mysql> desc phonecalls;
+------------+------------------+------+-----+---------+----------------+
| Field      | Type             | Null | Key | Default | Extra          |
+------------+------------------+------+-----+---------+----------------+
| id         | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| who        | varchar(200)     | NO   |     | NULL    |                |
| what       | varchar(200)     | NO   |     | NULL    |                |
| created_at | datetime         | NO   |     | NULL    |                |
| updated_at | datetime         | NO   |     | NULL    |                |
| initiator  | varchar(200)     | NO   |     | NULL    |                |
| info       | text             | NO   |     | NULL    |                |
+------------+------------------+------+-----+---------+----------------+
7 rows in set (0.00 sec)

我的视图列出了当前在数据库中的所有呼叫(由谁和什么):

<!doctype html>
<html>
<head>
  <title>Title</title>
  <script type="text/javascript" 
           src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js">
</script>
</head>
<body>
<h1>Welcome</h1>
<p>Here's a list of recent phonecalls</p>
    <ul class="call-list">
    @foreach($phonecalls as $call)
        <li> $call->who  -  $call->what  - 

        <a href="phonecalls/show/ $call->id ">Show</a> | 

         HTML::link('phonecalls/delete/'.$call->id, 'Delete')  | 
         HTML::link('phonecalls/update/'.$call->id, 'Update') 
        </li>
    </ul>

    -- Placeholder for AJAX content --
    <div id="call-info">
    </div>
</body>
</html>

这是我的简单控制器:

 class Phonecalls_Controller extends Base_Controller     

// Use $this within a method the same way you
// would use the object name outside of the class

public function get_index()
    
            $phonecalls = Phonecall::all();
            return View::make('phonecalls.index')->with('phonecalls', $phonecalls);
        
// ************************************
// DISPLAY CALL INFO
public function get_show($call_id)

    $call = Phonecall::find($call_id);

            // WHAT GOES HERE?


我希望用户能够点击视图中的“显示”并 将通话信息显示在...

<div id="call-info">
</div>

视图中的标签。


更新:

这是怎么回事...

我的 get_show() 方法

// ************************************
// SHOW CALL INFO
public function get_show($call_id)

$call = Phonecall::find($call_id);
return $call->info;

我的 Javascript

//************************************
// Phonecall AJAX Example
//************************************
$(document).ready(function() 
  $('.call-list > li > a').click(function(e)   // e=event
     e.preventDefault();
     var id = $(this).attr('id');
     $.get(BASE+'/phonecalls/show/'+id, function(data) 
     $("#call-info").html(data);
  )
);

【问题讨论】:

【参考方案1】:

这可以通过多种方式完成。

首先,你可以这样做:

public function get_show($call_id)

    $call = Phonecall::find($call_id);

    return View::make('phonecalls.single')->with('phonecal', $call);


在这种情况下,您需要为单个电话创建一个模板并将其放在电话文件夹中。

另一种选择是从 Laravel 应用返回 JSON 响应:

public function get_show($call_id)

    $call = Phonecall::find($call_id)->first();

    return Response::eloquent($call);


另一种选择是使用 javascript MVC 框架使获取/更新 AJAX 数据之类的事情变得非常容易,例如 Backbone JS 或 Angular JS 可以做到这一点。

无论哪种方式,如果您想处理 AJAX 数据,您需要构建一个 API 来区分常规站点和 AJAX 数据后端。

这是我的博客文章,其中详细介绍了如何完成此操作: http://maxoffsky.com/code-blog/building-restful-api-in-laravel-start-here/

另外,Laravel 中 AJAX 的一个很好的介绍是 Dayle Rees 的 Code Happy,章节 AJAX 内容: codehappy.daylerees.com/ajax-content

如果您还有其他问题,请告诉我,如果您觉得我有帮助,请批准此评论。谢谢!

更新:

要从控制器(或 Laravel 路由)实际加载内容,您需要使用 jQuery ajax、GET(加载数据)或 POST(发布表单结果) 这是一个例子:

 $('#get-info').click(function(e)   // e=event
        e.preventDefault();
        var BASE = "<?php echo URL::base(); ?>";
        // attempt to GET the new content
        $.get(BASE+'phonecalls/show/2', function(data) 
            $('#content').html(data);
        );

【讨论】:

maxoffsky,我想将返回的 $call->info 显示到用户单击“显示”的同一视图(上面的索引视图),而无需用户刷新页面。我想我错过了 $call->info 如何将它从控制器返回到索引视图并放在 啊,要加载东西,你需要使用 AJAX,在 jQuery 中你可以使用 .ajax 或 .get 或 .post(取决于你需要做什么)在这种情况下,它可以是 .得到。让我更新一下我的答案。 好的,太好了。这可能是我需要完成的部分。我会告诉你。谢谢@maxoffsky! 接近@maxoffsky。我已对原始问题添加了更新。 哈!我需要在控制器中做的就是说return $call-&gt;info; 并将其显示在视图中。没有页面刷新! 【参考方案2】:

我花了一段时间才弄明白,因为 webz 中的示例有点令人困惑,因为提到将 headers 更改为 csrf 令牌等等。这是一个示例,希望对其他人有所帮助。

首先:出现在您视图中的表单:

 Form::open(['id' => 'testForm']) 

   <p> Form::label('title', 'Title') 
    Form::text('title') </p>

   <p> Form::label('description', 'Description') 
    Form::text('description') </p>

   <p> Form::submit('Submit') </p>

 Form::close() 

第二:在route.php写下你的路线:

Route::post('ad', 'AdController@store');

第三:控制器:

public function store()


if(Request::ajax())

    $ad = new ad; 
    $ad -> title = Input::get('title');
    $ad -> description = Input::get('description');
    $ad -> save();

    $response = array(
        'status' => 'success',
        'msg' => 'Option created successfully',
    );

    return Response::json( $response );

    


第四:jquery ajax请求:

$('form#testForm').submit(function(e)
  e. preventDefault();


  var str1 = $('input[name="title"]').val();
  var str2 = $('input[name="description"]').val();
  var str3 = $('input[name="_token"]').val();
  var data = title:str1,description:str2, token:str3;
  //console.log(data);
  var request = $.ajax(
    url: "ad",
    type: "POST",
    data: data ,
    dataType: "html"
  );

  request.done(function( msg ) 
    var response = JSON.parse(msg);
    console.log(response.msg);
  );

  request.fail(function( jqXHR, textStatus ) 
    console.log( "Request failed: " + textStatus );
  );

  );

就是这样。为了保护您可以将控制器中的Session::token() == Input::get('_token') 设置为if 检查。 这只是一个可以很好地帮助您入门的示例。如果 www.pretty.url 是您的 localhost 或本地私有开发 url,则可能需要使用绝对 URL(在这种情况下使用 http://www.pretty.url/ad)。

【讨论】:

【参考方案3】:

您必须能够拦截对“显示”链接的点击。如果您将控制器设为restful,那么向您的控制器发出 ajax 请求应该很容易。

当用户clicks 在显示链接上时,您必须发送ajax request。

我建议你将结果输出为JSON,这样以后使用js输出结果就很容易了。

【讨论】:

以上是关于在 Laravel 中使用 AJAX 与数据库交互的主要内容,如果未能解决你的问题,请参考以下文章

前端与后端有哪几种ajax交互方法

利用ajax与后台交互容易出现的问题及解决办法

如何在 Laravel 5.7 中将多个数据库数据传递到 jQuery 的自动完成(AJAX)中

laytpl模板——怎么使用ajax与数据交互

Ajax使用jQuery与后台交互

Laravel & VueJS 变量定义