在 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->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 与数据库交互的主要内容,如果未能解决你的问题,请参考以下文章