【问题标题】:Using AJAX in Laravel to interact with database在 Laravel 中使用 AJAX 与数据库交互
【发布时间】: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);
  })
});

【问题讨论】:

    标签: jquery laravel


    【解决方案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输出结果就很容易了。

      【讨论】:

        猜你喜欢
        相关资源
        最近更新 更多
        热门标签