在Laravel中使用AJAX与数据库进行交互
我正在学习基于Model,View,Controller范例的Laravel PHP框架。 我一直试图将AJAX融入我的简单入门应用程序……一个电话呼叫记录器。 这是我通常放弃的地方。 但我拒绝!
所以我有我的Phonecall模型:
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)
我的视图列出了当前数据库中的所有呼叫(按谁和什么):
Title Welcome
Here's a list of recent phonecalls
@foreach($phonecalls as $call) - {{ $call->who }} - {{ $call->what }} - id }}">Show | {{ HTML::link('phonecalls/delete/'.$call->id, 'Delete') }} | {{ HTML::link('phonecalls/update/'.$call->id, 'Update') }}
{{-- Placeholder for AJAX content --}}
这是我简单的控制器:
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? }
我希望用户能够在视图中单击“显示”并在…中显示呼叫信息
视图中的标签。
更新:
这是它做了什么……
我的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); }) });
这可以通过多种方式完成。
首先,你可以这样做:
public function get_show($call_id) { $call = Phonecall::find($call_id); return View::make('phonecalls.single')->with('phonecal', $call); }
在这种情况下,您需要为单个电话呼叫创建模板并将其放入phonecalls文件夹中。
另一个选择是从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 = ""; // attempt to GET the new content $.get(BASE+'phonecalls/show/2', function(data) { $('#content').html(data); });
我花了一段时间才弄明白,因为webz中的示例有点混乱,引用了更改headers
来解释csrf
令牌等等。 这是一个例子,我希望它可以帮助别人。
第一:您认为的forms:
{{ Form::open(['id' => 'testForm']) }} {{ Form::label('title', 'Title') }} {{ Form::text('title') }}
{{ Form::label('description', 'Description') }} {{ Form::text('description') }}
{{ Form::submit('Submit') }}
{{ 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检查。 这只是一个可以帮助您入门的示例。 可能需要使用绝对URL(在这种情况下使用http://www.pretty.url/ad
)www.pretty.url是您的localhost
或本地私有开发URL。
您必须能够拦截“显示”链接上的点击。 如果让控制器保持稳定,那么向控制器发出ajax请求应该很容易。
当用户单击 “显示”链接时,您将发送ajax请求 。
我建议你将结果输出为JSON,这样以后使用js输出结果非常容易。