如何在laravel中找到数据库逻辑?

时间:2017-07-15 15:20:01

标签: php laravel

我目前是laravel的新手,我正试图用laravel包围代码结构。学习laravel的原因是除了创建易于管理的应用程序之外,还要增加我创建良好代码的知识。出于这个原因,对我而言,我正在将我的应用程序构建为可接受的标准。

我已阅读了几篇文章,但我仍然不确定在哪里组织事情。

截至目前,我的应用程序结构如下:

app/
    Console
    Exceptions
    Http
       Controllers
           Auth
           Message
           Settings
       Middleware
    Providers
    Traits
        Message
        Settings

我的一个控制器看起来像这样:

<?php

namespace App\Http\Controllers\Message;

use DB;
use Auth;
use Request;
use App\Http\Controllers\Controller;

class TypeController extends Controller
{
    public function __construct () {
        $this->middleware('auth');
        $this->middleware('access');
    }

    public function type () {
        $this->adjustTypingStatus(1);
    }

    public function untype () {
        $this->adjustTypingStatus(0);
    }

    protected function adjustTypingStatus ($level) {
        DB::table('user_lobby_info')
            ->where('userid', Auth::User()->id)
            ->where('lobby', Request::get('lobbyid'))
            ->update([ 'typing' => $level ]);
    }
}

?>

问题

将控制器分成更小,更易于管理的部分的更好方法是什么?我应该将数据库逻辑放入模型中并只调用模型的方法吗?

2 个答案:

答案 0 :(得分:2)

这就是我如何分解控制器逻辑并将模型用于中小型项目。

<强> 1。创建表格和模型

此命令将创建您的模型, - 迁移将创建一个迁移文件,该文件引用可用于创建模型表的BluePrint类。

php artisan make:model UserLobbyInfo --migration

您似乎已经创建了一个数据库,因此您可能希望删除--migration,除非您想使用它来使用BluePrint创建模式。我个人喜欢使用迁移。您的模型将直接在Laravel 5中的App文件夹下创建。

<强> 2。修改模型文件

您可以在App文件夹中找到您的模型文件。在您的模型中,您应该添加您要插入或更新的字段(可填充质量的项目)以及表格的名称(如果它没有遵循Laravel惯例)(Laravel假定骆驼套管指示不同的单词和那个你的表以&#39;结尾,因此它认为你的表将是user_lobby_infos,在你的情况下,你的表名是user_lobby_info)。这就是我根据您上述查询中的数据对其进行更新的方法:

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class UserLobbyInfo extends Model
{
// Define mass fillable items
    protected $fillable = array('userid','lobby','typing');

//Define table
    protected $table = 'user_lobby_info';

}

如何使用模型

此模型现在具有从其扩展的Illuminate \ Database \ Eloquent \ Model类提供的所有方法,因此您可以执行以下操作:

//To query all content:
$index = UserLobbyInfo::all();

//To query specific content:
$userLobby = UserLobbyInfo::where('id', '=', 1)->first();

//Save things:
$userLobbyInfo = UserLobbyInfo::where('id', '=', 1)->first();
$userLobbyInfo->lobby = Request::get('lobbyid')
$userLobbyInfo->save();

//Using the model for your query above this is how you can send an update:
UserLobbyInfo::where('userid', '=', Auth::User()->id)
        ->where('lobby', '=', Request::get('lobbyid'))
        ->update([ 'typing' => $level ]);

第3。使用CRUD相关方法创建预先控制的控制器 此命令将创建一个控制器,其中包含您通常在CRUD应用程序中使用的所有方法(索引,显示,创建,保存,编辑,更新,删除)

php artisan make:controller UserLobbyController --resource

在每个功能中,您都可以使用所需的方法添加相应的模型。

<强> 4。添加传统上在CRUD App中使用的所有路由并链接到--resource方法 如果您使用--resource,您将能够使用资源函数,该函数将为您提供这些相应资源所需的所有路径。

Route::resource('userlobby', 'UserLobbyController');

路由文件中的一行将创建CRUD应用程序运行中常见的以下路由&#34; php artisan route:list | grep userlobby&#34;你会看到这些路线:

|        | GET|HEAD  | userlobby                                | userlobby.index      | App\Http\Controllers\UserLobbyController@index                          | web                |
|        | POST      | userlobby                                | userlobby.store      | App\Http\Controllers\UserLobbyController@store                          | web                |
|        | GET|HEAD  | userlobby/create                         | userlobby.create     | App\Http\Controllers\UserLobbyController@create                         | web                |
|        | GET|HEAD  | userlobby/{userlobby}                    | userlobby.show       | App\Http\Controllers\UserLobbyController@show                           | web                |
|        | PUT|PATCH | userlobby/{userlobby}                    | userlobby.update     | App\Http\Controllers\UserLobbyController@update                         | web                |
|        | DELETE    | userlobby/{userlobby}                    | userlobby.destroy    | App\Http\Controllers\UserLobbyController@destroy                        | web                |
|        | GET|HEAD  | userlobby/{userlobby}/edit               | userlobby.edit       | App\Http\Controllers\UserLobbyController@edit                           | web                |

<强> 5。将控制器压缩为CRUD方法 我将在下面进行编辑和更新,因为这可能会非常冗长。希望这能让您了解如何分解控制器:

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

use App\UserLobbyInfo;  // Add this to access your new model
use App\Http\Requests;

class UserLobbyController extends Controller
{

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        $updateLobby = UserLobbyInfo::where('id', '=', $id)->first(); //This queries the table specifically for the id, just for demo purposes.

        return view('lobbies.edit', compact('updateLobby')); //This will send the above defined array to your view to pre-populate.
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function update(Request $request, $id)
    {
        $userLobby = UserLobbyInfo::where('userid', '=', Auth::User()->id)
            ->where('lobby', '=', $request->lobbyid)->first();

         //Grab the UserLobby row you want to update.
        $updateLobby->typing = $level; //update the typing value
        $updateLobby->save(); // save it.
    }

对于更复杂的应用程序,我通常会将较重的控制器逻辑迁移到类中,并使用它来引用控制器中的类。当我编写具有多个表连接的复杂查询时,我也只使用DB :: class(特别是在该连接中需要多个where子句的连接)。

希望这有助于突出显示如何在Laravel中正确使用模型。

laravel文档中提供了大量此类信息。我也喜欢这个备忘单:laravel cheat sheet

还有其他问题,或者如果我没有完全回答你的问题,请告诉我。

答案 1 :(得分:1)

使用Eloquent而不是原始SQL查询或查询构建器查询。将所有与数据相关的逻辑放入模型类中:

public function getApprovedUsersWithPosts()
{
    return $this->where('approved', true)->with('posts')->get();
}

你的控制器应该很小。切勿将查询或其他逻辑放入控制器中。此外,使用DI而不是外墙:

protected $user;

public function __construct(User $user)
{
    $this->user = $user;
}

public function index()
{
    return view('users.approved', [
        'users' => $this->user->getApprovedUsers()
    ]);
}