四、存储和使用数据

在本章中,我们将介绍:

  • 使用迁移和模式创建数据表
  • 使用原始 SQL 语句进行查询
  • 使用 Fluent 查询
  • 使用雄辩 ORM 进行查询
  • 在模型中使用自动验证
  • 使用高级口才和人际关系
  • 创建 CRUD 系统
  • 使用雄辩导入 CSV
  • 使用 RSS 作为数据源
  • 使用属性更改表列名
  • 在 Laravel 中使用非雄辩的 ORM

简介

任何 web 应用的支柱之一都是数据的使用和操作。Laravel 提供了许多方便的方法来与数据库交互并显示它们的信息。在本章中,我们将从一些简单的数据库交互开始。然后我们将使用其他非数据库作为我们的数据源,然后为我们的 Laravel 应用进行一些定制。

使用迁移和模式创建数据表

使用 Laravel,我们可以使用模式和迁移轻松地创建我们的数据模型。在这个食谱中,我们将看到 Laravel 如何实现这一点的一些基本功能。

做好准备

对于这个配方,我们需要一个标准的 Laravel 安装,以及一个在我们的数据库配置文件中配置的 MySQL 数据库。

怎么做...

要完成这个食谱,按照这些步骤:

  1. 使用artisan :

    ```php php artisan migrate:install

    ```

    从命令提示符安装我们的迁移表 2. 创建一个迁移来保存创建新表的模式代码:

    ```php php artisan migrate:make create_shows_table

    ```

  2. 在我们的app/database/migrations目录中,找到应该类似2012_01_01_222551_create_shows_table.php命名的文件。添加模式以创建我们的表,并添加列:

    ```php class CreateShowsTable extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('shows', function($table)
        {
            $table->increments('id');
            $table->string('name', 140);
            $table->integer('rating')->nullable();
            $table->timestamps();
        });
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('shows');
    }
    

    } ```

  3. 使用以下命令运行迁移,将表添加到数据库中:

    ```php php artisan migrate

    ```

  4. 创建另一个迁移,以便我们可以向表中添加一列:

    ```php php artisan migrate:make add_actor_to_shows_table

    ```

  5. app/database/migrations目录中,找到有一个类似2012_01_01_222551_add_actor_to_shows_table.php的名字的文件。将该列添加到我们的模式中:

    ```php class AddActorToShowsTable extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::table('shows', function($table)
        {
            $table->string('actor')->nullable();
        });
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('shows', function($table)
        {
            $table->drop_column('actor');
        });
    }
    

    } ```

  6. 在命令提示符下运行迁移,将列添加到我们的表中:

    ```php php artisan migrate

    ```

它是如何工作的...

使用 Laravel 的 Artisan 命令行工具,我们运行命令来创建一个迁移表。这将跟踪我们所做的任何迁移和模式更改。然后我们使用 Artisan 创建一个迁移文件,该文件将保存我们的shows表的模式。

shows模式中,我们创建了一个简单的表格来保存电视节目列表,以及我们如何对它们进行评分。节目名称设置为字符串,评分设置为整数,我们使用 Laravel 的默认机制来创建时间戳。当我们运行迁移时,将为我们创建表。

如果我们决定要在表中添加另一列,我们只需使用 Artisan 创建另一个迁移文件。在这种情况下,我们将添加一个列来保存演员的姓名。我们的模式将获得我们已经创建的表,并将该列添加到其中。当我们重新运行迁移时,数据库中的所有内容都将被更新。

还有更多…

我们还可以通过使用 Artisan 的几个命令行开关为我们创建更多的样板代码。例如,要创建 shows 表,我们可以运行以下命令:

php artisan migrate:make create_shows_table –table=show –create

运行该命令将生成包含以下代码的迁移文件:

<?php

use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateShowsTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('shows', function(Blueprint $table)
        {
            $table->increments('id');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('shows');
    }

}

使用原始 SQL 语句进行查询

Laravel 提供了许多方法来访问我们的数据库。如果我们有以前使用过的查询,或者如果我们需要更复杂的查询,我们可以使用原始的 SQL 来访问我们的数据库。

做好准备

对于这个配方,我们将使用在中创建的表,使用迁移和模式配方创建数据表。

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在命令提示符下,创建一个迁移,这样我们就可以添加一些数据:

    ```php php artisan migrate:make add_data_to_shows_table

    ```

  2. 在我们的app/database/migrations目录中,找到一个类似2012_01_01_222551_add_data_to_shows_table.php的文件,使用原始 SQL 添加一些数据:

    ```php class AddDataToShowsTable {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    

    public function up() { $sql = 'INSERT INTO shows (name, rating, actor) VALUES (?, ?, ?)'; $data1 = array('Doctor Who', '9', 'Matt Smith'); $data2 = array('Arrested Development', '10', 'Jason Bateman'); $data3 = array('Joanie Loves Chachi', '3', 'Scott Baio'); DB::insert($sql, $data1); DB::insert($sql, $data2); DB::insert($sql, $data3); }

    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        $sql = "DELETE FROM shows WHERE name = ?";
        DB::delete($sql, array('Doctor Who'));
        DB::delete($sql, array('Arrested Development'));
        DB::delete($sql, array('Joanie Loves Chachi'));
    }
    

    } ```

  3. 在命令提示符下运行迁移,添加数据:

    ```php php artisan migrate

    ```

  4. 在我们的app/models目录中,创建一个名为Show.php的文件,并添加一个方法来获得显示:

    php class Show { public function allShows($order_by = FALSE,$direction = 'ASC') { $sql = 'SELECT * FROM shows'; $sql .= $order_by ? ' ORDER BY ' . $order_by. ' ' . $direction : ''; return DB::select($sql); } }

  5. 在我们的routes.php文件中,创建一个Show路线来显示来自模型的信息:

    php Route::get('shows', function() { $shows = new Show(); $shows_by_rating = $shows->allShows('rating', 'DESC'); dd($shows_by_rating); });

它是如何工作的...

为了在我们的shows表中填充一些数据,我们首先需要使用 Artisan 命令行工具创建一个迁移。在迁移文件的up方法中,我们创建一个简单的 SQL insert 命令,并传递三个参数。然后,我们创建三个数组,其值的顺序与查询中的列相同。然后我们将 SQL 语句变量和值数组传递给 Laravel 的DB::insert()命令。对于我们的down方法,我们使用一个 SQL delete 语句,按照节目的名称进行搜索。一旦我们运行迁移,我们的数据将填充到表中。

接下来,我们在前端创建一个与数据库交互的模型。我们的模型有一种方法来显示我们表中的所有显示,如果我们想重新排序它们的显示方式,可以选择参数。

我们的路线实例化了 Show 模型并运行了 allShows()方法。为了显示结果,我们使用了 Laravel 的dd()助手功能。此时,我们可以将数据传递给一个视图,并循环通过它来显示。

另见

  • 使用迁移和模式配方创建数据表

使用 Fluent 进行查询

Laravel 提供了许多访问数据库的方法。如果我们选择不写原始的 SQL 语句,我们可以使用 Fluent 查询生成器来简化事情。

做好准备

对于这个配方,我们将使用在中创建的表,使用迁移和模式配方创建数据表。

怎么做...

要完成这个配方,请遵循以下步骤:

  1. 在命令提示符下,创建一个迁移,这样我们就可以添加一些数据:

    ```php php artisan migrate:make add_data_to_shows_table

    ```

  2. 在我们的app/database/migrations目录中,找到一个类似于2012_01_01_222551_add_data_to_shows_table.php的文件,使用 Fluent 查询生成器

    ```php class AddDataToShowsTable {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        $data1 = array('name' => 'Doctor Who',
            'rating' => 9, 'actor' => 'Matt Smith');
        $data2 = array('name' => 'Arrested Development',
            'rating' => 10, 'actor' => 'Jason Bateman');
        $data3 = array('name' => 'Joanie Loves Chachi',
            'rating' => 3, 'actor' => 'Scott Baio');
        DB::table('shows')->insert(array($data1, $data2,
            $data3));
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        DB::table('shows')
            ->where('name', 'Doctor Who')
            ->orWhere('name', 'Arrested Development')
            ->orWhere('name', 'Joanie Loves Chachi')
            ->delete();
    }
    

    } ```

    添加一些数据 3. 运行迁移添加数据:

    ```php php artisan migrate

    ```

  3. 在我们的app/models目录中,创建一个名为Show.php的文件,并添加一个方法来获得显示:

    php class Show { public function allShows($order_by = FALSE,$direction = 'ASC') { $shows = DB::table('shows'); return $order_by ? $shows->order_by($order_by,$direction)->get() : $shows->get(); } }

  4. 在我们的routes.php文件中,创建一个Show 路线来显示来自模型的信息:

    php Route::get('shows', function() { $shows = new Show(); $shows_by_rating = $shows->allShows('rating', 'DESC'); dd($shows_by_rating); });

它是如何工作的...

为了在我们的shows表中填充一些数据,我们首先需要使用 Artisan 命令行工具创建一个迁移。在迁移文件的up方法中,我们创建了三个数组来保存我们的值,使用列名作为键。然后,这些数组被放入一个数组中,并传递给 Fluent insert函数。down方法使用where()orWhere()功能按名称定位记录,并删除它们。一旦我们运行迁移,我们的数据将填充到表中。

接下来,我们在前端创建一个与数据库交互的模型。我们的模型有一种方法来显示我们表中的所有显示,如果我们想重新排列它们的显示方式,可以选择参数。

我们的路线实例化了 Show 模型并运行了allShows()方法。为了显示结果,我们使用拉沃尔的dd()助手功能。我们还可以创建一个视图,并将数据传递到那里进行循环。

还有更多...

在 http://laravel.com/docs/queries 的 Laravel 文档中可以找到更多流畅的方法。

另见

  • 使用迁移和模式创建数据表的方法

使用功能表单进行查询

Laravel 提供了许多与数据库交互的方式。最简单的方法之一是使用雄辩的 ORM。它提供了一种简单直观的数据处理方式。

做好准备

对于这个配方,我们将使用在中创建的表,使用迁移和模式配方创建数据表。

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在命令提示符下,创建一个迁移,这样我们就可以添加一些数据:

    ```php php artisan migrate:make add_data_to_shows_table

    ```

  2. 在我们的app/database/migrations目录中,找到一个类似于2012_01_01_222551_add_data_to_shows_table.php的文件,使用 Fluent 查询生成器

    ```php class AddDataToShowsTable {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        $data1 = array('name' => 'Doctor Who',
            'rating' => 9, 'actor' => 'Matt Smith');
        $data2 = array('name' => 'Arrested Development',
            'rating' => 10, 'actor' => 'Jason Bateman');
        $data3 = array('name' => 'Joanie Loves Chachi',
            'rating' => 3, 'actor' => 'Scott Baio');
        DB::table('shows')->insert(array($data1, $data2,
            $data3));
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        DB::table('shows')
            ->where('name', 'Doctor Who')
            ->orWhere('name', 'Arrested Development')
            ->orWhere('name', 'Joanie Loves Chachi')
            ->delete();
    }
    

    } ```

    添加一些数据 3. 运行迁移添加数据:

    ```php php artisan migrate

    ```

  3. 在我们的app/models目录中,创建一个名为Show.php的文件,该文件扩展了Eloquent :

    php class Show extends Eloquent{ public function getTopShows() { return $this->where('rating', '>', 5)->orderBy('rating', 'DESC')->get(); } }

  4. 在我们的routes.php文件中,创建一个显示路线来显示来自模型的信息:

    ```php Route::get('shows', function() { $shows = Show::all(); echo '

    All Shows

    '; foreach ($shows as $show) { echo $show->name . ' - ' . $show->rating . ' - ' . $show->actor . '
    '; }
    $show_object = new Show();
    $top_shows = $show_object->getTopShows();
    echo '<h1>Top Shows</h1>';
    foreach ($top_shows as $top_show)
    {
        echo $top_show->name . ' - ' . $top_show->rating
             . ' - '. $top_show->actor . '<br>';
    }
    

    }); ```

它是如何工作的...

为了在我们的shows表中填充一些数据,我们首先需要使用 Artisan 命令行工具创建一个迁移。在迁移文件的up方法中,我们创建了三个数组来保存我们的值,使用列名作为键。然后,这些数组被放入一个数组中,并传递给 Fluent insert函数。down方法使用where()orWhere()功能按名称定位记录,并删除它们。一旦我们运行迁移,我们的数据将填充到表中。

接下来,我们在前端创建一个与数据库交互的模型。对于这个食谱,我们需要做的就是扩展Eloquent,ORM 会自动处理其他一切。我们还添加了一个返回所有顶级节目的方法。

我们的路由为我们的 Show ORM 对象调用all()方法;这将把所有数据放入$shows变量。然后我们在记录中做一个简单的循环,显示我们想要的字段。接下来,我们通过调用 Show 模型中的方法获得一个筛选列表,方法是只获取评级大于 5 且按评级排序的记录。

还有更多...

在这个食谱中,我们显示了路线内的所有数据。理想情况下,我们将数据传递到一个视图中并在那里显示。

另见

  • 使用迁移和模式创建数据表的方法

在模型中使用自动验证

当验证发送到数据库的数据时,理想情况下,我们应该将规则和验证放在我们的模型中。在这个食谱中,我们将看到实现这一点的一种方法。

做好准备

对于这个食谱,我们需要一个配置了 MySQL 数据库的标准 Laravel 安装。我们还需要通过运行 Artisan 命令php artisan migrate:install来设置我们的迁移表。

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在命令提示符下,为一个简单的users表创建一个迁移:

    ```php php artisan migrate:make create_users_table

    ```

  2. 在迁移文件中创建模式。该文件位于app/database/migrations目录下,将被命名为类似2012_01_01_222551_create_users_table.php :

    ```php use Illuminate\Database\Migrations\Migration;

    class CreateUsersTable extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function($table)
        {
            $table->increments('id');
            $table->string('username', 100);
            $table->string('email', 100);
            $table->timestamps();
        });
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('users');
    }
    

    } ```

  3. 运行迁移:

    ```php php artisan migrate

    ```

  4. 在我们的app/models目录中创建一个名为User.php的文件。如果已经有了一个名为User.php的文件,我们可以直接改名为:

    ```php <?php class User extends Eloquent {

    protected $table = 'users';
    
    private $rules = array(
        'email' => 'required|email',
        'username' => 'required|min:6'
    );
    
    public function validate($input) {
        return Validator::make($input, $this->rules);
    }
    

    } ```

  5. 制作一个加载 ORM 并尝试保存一些数据的路径:

    ```php $user = new User(); $input = array();

    $input['email'] = 'racerx@example.com';
    $input['username'] = 'Short';
    $valid = $user->validate($input);
    if ($valid->passes()) {
        echo 'Everything is Valid!';
        // Save to the database
    } else {
        var_dump($valid->messages());
    }
    

    ```

它是如何工作的...

首先,我们为一个基本的users表创建一个迁移。在我们的模式中,我们设置了一个带有标识、用户名、电子邮件标识和时间戳的表。然后运行迁移,在数据库中创建表。

接下来,我们设置我们的用户模型并扩展Eloquent。我们需要创建我们的规则,使用一个名为$rules的私有变量,该变量包含一组我们想要检查的验证规则。在我们的模型中,我们创建了一个validate方法。这将使用我们刚刚设置的规则通过 Laravel 的Validator运行我们的输入。

在我们的路线中,我们创建一个新用户并添加一些值。在保存之前,我们通过validate方法运行输入;如果失败,我们可以遍历验证错误消息。如果通过,我们就可以将输入保存到数据库中

还有更多...

还有一些其他方法可以使用模型来验证我们的数据。一种方法是使用一个可以为我们处理大部分验证工作的包。一个很好的套餐是热情,可以在https://github.com/laravelbook/ardent找到。

使用高级口才和人际关系

使用 Laravel 的雄辩 ORM 的一大好处是我们可以轻松地与多个具有外键和数据透视表的表进行交互。在这个食谱中,我们将看到建立模型和对连接的表运行查询是多么容易。

做好准备

对于这个配方,我们将使用在之前的配方中创建的showsusers使用迁移和模式创建数据表使用模型中的自动验证

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在命令提示符下,为新的数据透视表创建迁移:

    ```php php artisan migrate:make create_show_user

    ```

  2. 打开app/database/migrations目录下的迁移文件,添加模式:

    ```php use Illuminate\Database\Migrations\Migration;

    class CreateShowUser extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('show_user', function($table)
        {
            $table->increments('id');
            $table->integer('user_id');
            $table->integer('show_id');
            $table->timestamps();
        });
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('show_user');
    }
    

    } ```

  3. 运行迁移:

    ```php php artisan migrate

    ```

  4. app/model目录下创建User.php文件:

    php class User extends Eloquent { public function shows() { return $this->belongsToMany ('Show'); } }

  5. 在我们的app/model目录下创建一个Show.php文件:

    php class Show extends Eloquent { public function users() { return $this->belongsToMany ('User'); } }

  6. routes.php中制作路线添加新用户,并附上两个显示:

    ```php Route::get('add-show', function() { // Create a new User $user = new User(); $user->username = 'John Doe'; $user->email = 'johndoe@example.com'; $user->save();

    // Attach two Shows
    $user->shows()->attach(1);
    $user->shows()->attach(3);
    
    foreach($user->shows()->get() as $show) {
        var_dump($show->name);
    }
    

    }); ```

  7. 制作一条路线,让所有用户都加入到一个节目中:

    php Route::get('view-show', function() { $show = Show::find(1)->users; dd($show); });

它是如何工作的...

我们的第一个任务是创建一个透视表,将我们的users表与我们的表连接起来。在我们的迁移模式中,我们需要为我们的user_idshow_id添加列。然后,我们运行迁移,在数据库中设置表。

为了建立我们的模型,我们需要创建一个函数来返回我们的多对多关系。在我们的用户模型中,我们创建了指向关系的显示模型的shows()函数。在 Show 模型中,我们创建了一个名为users()的函数,它指向我们的用户模型。有了这个设置,我们现在可以轻松地对这两个表运行查询。

接下来,我们将创建一条添加新用户的路由。保存用户后,我们使用attach()方法创建与节目的关系,并传入我们想要附加的节目的 ID。在这之后,如果我们查看我们的show_user表,我们会看到两条记录——一条是我们新用户的标识和节目标识1,另一条是3的节目标识。通过在我们的路线中运行get()方法,我们可以遍历记录并查看哪些节目名称与我们的用户相关联。

我们的下一条路线将进行展示,并获得所有加入的用户。在我们的例子中,我们得到 ID 为1的节目,然后得到所有的用户。使用 Laravel 的dd()助手,我们可以看到我们的结果。

还有更多...

数据库关系可能变得相当复杂,这个方法只是触及了能做的事情的表面。要了解更多关于 Laravel 的雄辩 ORM 如何使用关系的信息,请查看 http://laravel.com/docs/eloquent#many-to-many 的文档。

创建一个 CRUD 系统

为了与我们的数据库交互,我们可能需要创建一个 CRUD(创建、读取、更新和删除)系统。这样,我们无需单独的数据库客户端就可以添加和更改数据。这个食谱将使用我们的 CRUD 系统的 RESTful 控制器。

做好准备

对于这个配方,我们将在配方中创建的用户表的基础上,使用模型中的自动验证。

怎么做...

要完成此配方,请遵循以下步骤:

  1. app/controllers目录中,创建一个名为UsersController.php的文件,并添加以下代码:

    ```php <?php

    class UsersController extends BaseController {

    public function getIndex()
    {
        $users = User::all();
        return View::make('users.index')->with('users',$users);
    }
    
    public function getCreate()
    {
        return View::make('users.create');
    }
    
    public function postCreate()
    {
        $user = new User();
        $user->username = Input::get('username');
        $user->email = Input::get('email');
        $user->save();
        return Redirect::to('users');
    }
    
    public function getRecord($id)
    {
        $user = User::find($id);
        return View::make('users.record')->with('user',$user);
    }
    
    public function putRecord()
    {
        $user = User::find(Input::get('user_id'));
        $user->username = Input::get('username');
        $user->email = Input::get('email');
        $user->save();
        return Redirect::to('users');
    }
    
    public function deleteRecord()
    {
        $user = User::find(Input::get('user_id'))->delete();
        return Redirect::to('users');
    }
    

    } ```

  2. 在我们的routes.php文件中,给控制器添加一条路线:

    ```php Route::controller('users', 'UsersController');

    ```

  3. app/views目录中,创建另一个名为users的目录,在其中创建一个名为index.php的文件,并添加以下代码:

    php <style> table, th, td { border:1px solid #444 } </style> <table> <thead> <tr> <th>User ID</th> <th>User Name</th> <th>Email</th> <th>Actions</th> </tr> </thead> <tbody> <?php foreach($users as $user): ?> <tr> <td><?php echo $user->id ?></td> <td><?php echo $user->username ?></td> <td><?php echo $user->email ?></td> <td> <a href="users/record/<?php echo $user->id ?>">Edit</a> <form action="users/record"method="post"> <input type="hidden" name="_method"value="DELETE"> <input type="hidden" name="user_id"value="<?php echo $user->id?>"> <input type="submit"value="Delete"> </form> </td> </tr> <?php endforeach; ?> </tbody> </table> <a href="users/create">Add New User</a>

  4. app/views/users目录下,新建一个名为create.php的文件,格式如下:

    php <form action="create" method="post"> Username:<br> <input name="username"><br> Email<br> <input name="email"><br> <input type="submit"> </form>

  5. app/views/users目录下,添加一个名为record.php的文件,使用如下形式:

    php <form action="" method="post"> <input type="hidden" name="_method" value="put"> <input type="hidden" name="user_id" value="<?php echo$user->id ?>"> Username:<br> <input name="username" value="<?php echo $user->username ?>"><br> Email<br> <input name="email" value="<?php echo $user->email?>"><br> <input type="submit"> </form>

它是如何工作的...

在我们的控制器中,我们的方法名可以预先加上我们想要使用的 HTTP 动词。然后我们在我们的 routes 文件中添加路由,这样它就指向了正确的位置。

我们的第一个方法将生成所有用户的列表。我们将用户传递给我们的视图,然后遍历他们并在一个简单的表格中显示他们。

在该表下,我们有一个链接,指向添加新用户的第二个方法。我们的getRreate()方法显示一个简单的表单,该表单被发布和保存。保存后,我们被重定向回列表页面。

要编辑记录,我们创建一个getRecord()方法,将记录的标识传递给它。我们的视图是一个表单,该表单使用传入的 ID 的用户值自动填充。既然我们在做更新,我们想用put动词;为了实现这一点,我们需要一个名为_method的隐藏字段和我们想要使用的请求的值。表单提交后,Laravel 会发送到 putRecord()方法,并更新信息。

最后,为了删除一条记录,我们创建了一个简单的表单,其中包含名为_method的隐藏字段和值DELETE。提交后,Laravel 会将其发送到deleteRecord()方法,用户将从数据库中删除。

还有更多...

请注意,这是 CRUD 系统中最基本的。对于一个完整的系统,我们需要在添加或编辑数据时添加验证和错误检查。

使用功能强大的导入 CSV

处理数据时,我们可能会遇到许多不同的来源和文件类型。常见的类型是 CSV 或逗号分隔值文件。在这个配方中,我们将获取一个 CSV 文件的内容,并将它们插入到我们的数据库中。

做好准备

首先,我们需要一个标准的 Laravel 安装,也就是配置了 MySQL 数据库的。我们还需要通过运行 Artisan 命令php artisan migrate:install来创建我们的迁移表。

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在文本编辑器中,创建一个名为scifi.csv的文件,将其保存到应用的public文件夹中。加入以下数据:

    php Spock,Star Trek Kirk,Star Trek Luke,Star Wars Lando,Star Wars Deckard,Blade Runner Dave,2001

  2. 在命令提示符下,创建迁移:

    ```php php artisan migrate:make create_scifi_table

    ```

  3. 打开刚刚创建的迁移文件,并在我们的模式中添加:

    ```php use Illuminate\Database\Migrations\Migration;

    class CreateScifiTable extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('scifi', function($table)
        {
            $table->increments('id');
            $table->string('character');
            $table->string('movie');
            $table->timestamps();
        });
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('scifi');
    }
    

    } ```

  4. 运行迁移以创建表:

    ```php php artisan migrate

    ```

  5. 在名为Scifi.php :

    php class Scifi extends Eloquent { protected $table = 'scifi'; }

    app/models目录中创建一个模型 6. 创建一条新路线来处理我们的 CSV 并保存结果:

    ```php Route::get('csv', function() { if (($handle = fopen(public_path() .. '/scifi.csv','r')) !== FALSE) { while (($data = fgetcsv($handle, 1000, ',')) !==FALSE) { $scifi = new Scifi(); $scifi->character = $data[0]; $scifi->movie = $data[1]; $scifi->save(); } fclose($handle); }

    return Scifi::all();
    

    }); ```

它是如何工作的...

我们的第一步是创建一个简单的 CSV 文件,其中包含一些科幻角色的名字和他们出现的电影。然后我们创建一个迁移和一个模式,该模式将添加一个带有我们想要保存的字段的scifi表。

对于我们的模型,我们扩展Eloquent并添加一个名为$table的受保护变量,该变量被设置为我们表的名称。由于我们的表名不是复数scifi,我们需要让雄辩者知道使用哪个表。

在我们的路线中,我们打开文件,分别使用 PHP 的内置函数fopen()fgetcsv()循环数据。在每个循环中,我们创建一个新的Scifi对象,然后将这些值设置为我们从 CSV 文件中获得的数据。循环之后,我们关闭文件。

为了查看我们的数据,我们在我们的Scifi对象上调用all()方法,并返回它来显示所有的数据。

使用 RSS 作为数据源

许多博客和新闻网站提供他们内容的 RSS 源。使用 Laravel,我们可以获取这些提要并将其显示为提要阅读器,甚至可以将它们保存在我们自己的数据库中。

做好准备

对于这个食谱,我们只需要一个标准的 Laravel 安装,和 RSS URL 来使用。

怎么做...

要完成此配方,请执行以下步骤:

  1. 在我们的routes.php文件中创建一个新的路线,以便在 RSS 中读取:

    ```php Route::get('rss', function() { $source = 'http://rss.cnn.com/rss/cnn_topstories.rss';

    $headers = get_headers($source);
    $response = substr($headers[0], 9, 3);
    if ($response == '404')
    {
        return 'Invalid Source';
    }
    
    $data = simplexml_load_string(file_get_contents($source));
    
    if (count($data) == 0)
    {
        return 'No Posts';
    }
        $posts = '';
        foreach($data->channel->item as $item)
        {
            $posts .= '<h1><a href="' . $item->link . '">'. $item->title . '</a></h1>';
            $posts .= '<h4>' . $item->pubDate . '</h4>';
            $posts .= '<p>' . $item->description . '</p>';
            $posts .= '<hr><hr>';
        }
        return $posts;
    

    }); ```

它是如何工作的...

我们创建了一个路线来存放我们的 RSS 阅读器。然后我们将我们的$source变量设置为我们想要消费的任何一个 RSS 源。

为了确保我们的源代码仍然是活动的,我们使用了 PHP 函数get_headers(),并抓取响应代码。如果代码是404,那么这个网址不起作用。

接下来,我们从 URL 中获取内容,并使用simplexml_load_string()函数处理提要中的 XML。如果那个提要真的有数据,我们可以循环遍历它并显示信息。我们还可以在循环时将其保存到数据库中。

使用属性更改表列名

有时我们可能正在使用一个数据库,这个数据库是用不太符合逻辑的列名创建的。在这些情况下,我们可以使用 Laravel 的雄辩 ORM 来允许我们使用更标准化的名称与表进行交互,而不必进行数据库更改。

做好准备

对于这个配方,我们需要一个标准的 Laravel 安装,一个正确配置的 MySQL 数据库,以及通过运行命令php artisan migrate:install设置的迁移表。

怎么做...

要完成此配方,请遵循以下步骤:

  1. 在命令提示符下为我们的表创建一个名为odd的迁移
  2. 创建一个迁移,将一些数据添加到表中,在命令提示符下:

    ```php php artisan migrate:make add_data_to_odd_table

    ```

  3. app/database/migrations文件夹中,打开create_odd_table迁移并添加模式:

    ```php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration;

    class CreateOddTable extends Migration {

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('odd', function(Blueprint $table)
        {
            $table->increments('MyIDcolumn');
            $table->string('MyUsernameGoesHere');
            $table->string('ThisIsAnEmail');
            $table->timestamps();
        });
    }
    
    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('odd');
    }
    

    } ```

  4. app/database/migrations目录下,打开文件,添加一些数据:

    ```php use Illuminate\Database\Migrations\Migration;

    class AddDataToOddTable extends Migration {

    /**
     * Make changes to the database.
     *
     * @return void
     */
    public function up()
    {
        $data1 = array('MyUsernameGoesHere' => 'John Doe','ThisIsAnEmail' => 'johndoe@example.com');
        $data2 = array('MyUsernameGoesHere' => 'Jane Doe','ThisIsAnEmail' => 'janedoe@example.com');
        DB::table('odd')->insert(array($data1, $data2));
    }
    
    /**
     * Revert the changes to the database.
     *
     * @return void
     */
    public function down()
    {
        DB::table('odd')->delete();
    }
    

    } ```

  5. 在命令提示符下,运行迁移:

    ```php php artisan migrate

    ```

  6. app/models目录中,创建一个名为Odd.php的新文件,并创建获取者:

    ```php class Odd extends Eloquent { protected $table = 'odd';

    public function getIdAttribute($value) {
        return $this->attributes['MyIDcolumn'];
    }
    
    public function getUsernameAttribute($value) {
        return $this->attributes['MyUsernameGoesHere'];
    }
    
    public function getEmailAttribute($value) {
        return $this->attributes['ThisIsAnEmail'];
    }
    

    } ```

  7. routes.php中新建一条路线,使用常规列名

    php Route::get('odd', function() { $odds = Odd::all(); foreach($odds as $odd) { echo $odd->MyIDcolumn . ' - ' . $odd->MyUsernameGoesHere . ' - ' . $odd->ThisIsAnEmail . '<br>'; } });

    访问表格 8. 使用更标准的列名进行另一条路线:

    php Route::get('notodd', function() { $odds = Odd::all(); foreach($odds as $odd) { echo $odd->id . ' - ' . $odd->username . ' - '. $odd->email . '<br>'; } });

它是如何工作的...

首先,我们创建两个迁移文件。一个文件将实际创建具有非标准列名的表,另一个文件将填充数据。

对于我们的模型,我们扩展了Eloquent并增加了一些get方法。在每个get方法中,设置我们的属性,它告诉雄辩者我们想要使用哪个列名称。现在,由于我们的模型中有getUsernameAttribute()方法,每当我们试图访问对象中的用户名时,它实际上会访问我们定义的列名。

然后,我们创建一个路由,从我们的odd表中提取所有记录,并循环通过。对于我们的第一条路线,我们使用他们的真实姓名访问列。在我们的第二条路线中,我们使用新的名称。如果我们访问这两条路线,我们会看到完全相同的信息。

在 Laravel 中使用非雄辩的 ORM

Laravel 的雄辩 ORM 简单易用,非常高效。然而,有许多不同的 PHP 表单,我们可能会决定选择另一个表单。在这个食谱中,我们将安装红豆 ORM 并将其用于我们的数据。

做好准备

对于这个食谱,我们将使用红豆表单。你需要从http://www.redbeanphp.com/manual/installing下载,并解压文件。然后将文件rb.php移动到你应用的app/libraries目录。

怎么做...

要完成此配方,请遵循以下步骤:

  1. composer.json文件中,让我们的自动加载器加载我们的libraries目录。autoload部分应该类似于这样:

    php "autoload": { "classmap": [ "app/commands", "app/controllers", "app/models", "app/database/migrations", "app/database/seeds", "app/tests/TestCase.php", "app/libraries" ], }

  2. 在命令提示符下,转储我们的自动加载器:

    ```php php composer.phar dump-autoload

    ```

  3. 在我们的routes.php文件中,我们将添加一个简单的配置:

    php $db_setup = Config::get('database.connections.mysql'); R::setup('mysql:host=' . $db_setup['host'] . ';dbname='. $db_setup['database'], $db_setup['username'],$db_setup['password']);

  4. 创建路线,添加一些数据,然后显示:

    ```php Route::get('orm', function() { $superhero = R::dispense('superheroes'); $superhero->name = 'Spiderman'; $superhero->city = 'New York'; $superhero->age = 24;

    $id1 = R::store($superhero);
    
    $superhero = R::dispense('superheroes');
    $superhero->name = 'Superman';
    $superhero->city = 'Metropolis';
    $superhero->age = 50;
    
    $id2 = R::store($superhero);
    
    $superhero = R::dispense('superheroes');
    $superhero->name = 'Batman';
    $superhero->city = 'Gotham';
    $superhero->age = 36;
    
    $id3 = R::store($superhero);
    
    $heroes = R::batch('superheroes',array($id1, $id2,$id3));
    
    foreach ($heroes as $hero)
    {
        echo $hero->name . ' - ' .  $hero->city . ' - '. $hero->age . '<br>';
    }
    

    }); ```

它是如何工作的...

将红豆文件添加到我们的libraries目录后,我们需要更新我们的 composer 文件的自动加载器,这样它将加载rb.php文件。

设置数据库配置可以在不同的地方完成,但是对于这个食谱,我们将在我们的路线文件的顶部设置它。因此,我们可以将数据库信息保存在一个地方,我们使用 Laravel 的数据库配置来设置它。

一旦完成所有这些,我们就可以在应用中使用红豆了。在我们的路线中,我们创造了三个超级英雄,并将他们添加到superheroes表中。使用 RedBean,如果表不存在,它会自动为您创建它,并添加相关的列。

最后,我们得到三条记录,并可以循环通过它们来显示信息。

还有更多...

RedBeans 有很多特性,作为 ORM 的替代可能会很有用。要查看所有功能,请访问其位于 http://redbeanphp.com/manual/的官方手册。