在 Laravel 中有更好的方法吗?

Is there a better way to do this in Laravel?

我是 Laravel 的新手,我一直在为角色扮演游戏编写 CMS,我 运行 有一些我认为是混乱/糟糕做法的代码,我是只是想知道这真的是最简单和最好的方法吗?我主要寻找的是在不更改太多代码的情况下以最佳方式执行此操作的最佳实践。

所以我需要做的是我需要将用户业务和用户业务职位传递给业务概览view/page。我有每个 Business 和 BusinessPositions 表的模式,我将在下面 post。

企业:

<?php
namespace App\Database\Website\Roleplay\Business;

use Eloquent;

class Businesses extends Eloquent
{
    protected $primaryKey   = 'id';
    protected $table        = 'srp_businesses';
    public $timestamps      = false;
    protected $fillable     = [];

    public function positions()
    {
      return $this->hasMany('App\Database\Roleplay\Business\BusinessPositions', 'business_id');
    }

    public function founder()
    {
      return $this->belongsTo('App\Database\Website\User\Player');
    }
}

业务职位:

<?php
namespace App\Database\Website\Roleplay\Business;

use Eloquent;

class BusinessPositions extends Eloquent
{
    protected $primaryKey   = 'id';
    protected $table        = 'srp_business_positions';
    public $timestamps      = false;
    protected $fillable     = [];
}

这是发送我的视图的控制器函数

$businesses = Cache::remember('overview.businesses', 1, function() {
    return Businesses::get();
});

$businessPositions = Cache::remember('overview.business.positions', 1, function() {
    return BusinessPositions::get();
});

$acceptedCount = $businesses->where('business_owner_id', '=', Auth::user()->id)
    ->where('business_status', '=', 'accepted')
    ->count();
$pendingCount = $businesses->where('business_owner_id', '=', Auth::user()->id)
    ->where('business_status', '=', 'pending')
    ->count();
$myBusiness = Businesses::find(Auth::user()
    ->roleplay->business_id);
$myBusinessPosition = $businessPositions->where('business_id', '=', $myBusiness->business_id)
    ->where('position_id', '=', Auth::user()->roleplay->business_position)
    ->first();

return view('frontend.business.overview', compact('acceptedCount', 'pendingCount', 'myBusiness', 'myBusinessPosition'));

我认为混乱的部分是我获得业务职位的方式,也许有办法让业务变得更好?

我如何获得业务职位(代码分解)

$myBusinessPosition = $businessPositions->where('business_id', '=', $myBusiness->business_id)
    ->where('position_id', '=', Auth::user()
        ->roleplay->business_position)
    ->first();

我正在使用 Laravel 5.3,谢谢。

一些提示:

范围和关系

您可能会在用户模型中引入与企业的直接关系。

通过使用 query scopes,您的代码会更容易阅读:

$user->businesses()->accepted()->count();
$user->businesses()->pending()->count();

或者如果您只使用 1 个动态范围:

$user->businesses()->ofStatus('accepted')->count();
$user->businesses()->ofStatus('pending')->count();

使用集合

在那种情况下,您可以只用一个 SQL 查询来计算所有企业(此处的过滤发生在内存中,returns 一个集合,您可以在其中获得按状态键入的计数):

$countByStatus = $user->businesses
    ->pluck('status')
    ->groupBy(function($item) { return $item; }) 
    ->flatMap(function($item, $key) { return [$key => $item->count()]; });

您可以使用作用域,单击 here 阅读相关文档。

这样看起来是不是干净多了?

$user->businesses()->ofStatus('accepted')->count();
$user->businesses()->ofStatus('pending')->count();

此外,您应该修复对 auth 的调用,而不是像这样进行原始调用。

->where('business_owner_id', '=', Auth::user()->id)

创建一个变量,并对其进行保护,以便在您的代码范围内进一步使用它。

$user = Auth::user()

然后,只使用用户,而不是授权码。

->where('business_owner_id', '=', $user->id)