在Laravel有更好的方法吗?

时间:2016-12-21 15:31:18

标签: php laravel laravel-5.3

我对Laravel很新,我一直在为一个角色扮演游戏编写一个CMS,我已经遇到了一些代码,我认为它们看起来很混乱/糟糕,我只是想知道这真的是最简单和最好的方式去做吧?我主要寻找的是在不改变我的代码的情况下以最佳方式执行此操作的最佳实践。

所以我需要做的是我需要将用户业务和用户业务位置传递到业务概览视图/页面。我有Business和BusinessPositions的每个表的模态,我将在下面发布。

业务:

<?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');
    }
}

BusinessPositions:

<?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,谢谢。

2 个答案:

答案 0 :(得分:1)

您可以使用作用域,单击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)

答案 1 :(得分:0)

只是一些提示:

范围和关系

您可以在用户模型中向企业介绍直接关系。

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

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

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

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

使用馆藏

在这种情况下,您可以只使用一个SQL查询来计算所有业务(此处在内存中进行过滤,返回一个集合,其中您获得了由状态键入的计数):

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