【问题标题】:Laravel 5 Model Relation to Query in bladeLaravel 5 模型与刀片中的查询关系
【发布时间】:2016-12-19 00:06:29
【问题描述】:

架构用户

ID|NAME
1 |John
2 |Doe

架构财务

ID|USER_ID|PROFIT |DATE
1 |1      |1000   |2016-12-22
2 |2      |-2000  |2016-12-22
3 |1      |2000   |2016-12-24
4 |2      |-2000  |2016-12-24

用户模型

class User extends Model
{
    public function Financial()
    {
        return $this->hasMany('App\Financial');
    }
}

财务模型

class Financial extends Model
    {
        public function financial()
        {
            return $this->belongsTo('App\User');
        }
    }

我的控制器

class MyController extends Controller
{
    public function index()
    {
        $user = User::get();
        $financial = Financial::get();
        return view('page.index',compact('user','financial'));
    }
}

我的刀片

@foreach ($user as $u)
    <tr>
        <td>{{$u->id}}</td>
        <td>
             {{$u->financial->sum('gross')}}
             {{-- Above code doesn't work --}}
             {{-- Run something link --}}
             {{select (sum(profit) as total) from financial where user_id = $u->id}}
        </td>
    </tr>
@endforeach

问题

如何从我的刀片中实现 select?我打算使用 @inject('DB','Illuminate\Support\Facades\DB') 所以我可以在我的刀片中使用 DB::raw,但是我对如何执行查询以实现 select 感到困惑 :(

【问题讨论】:

  • 您在Financial::class 中的transaction() 方法中有错字。您还应该遵守 Laravel 命名约定,并在 User::class 中使用小写的 financials()。还有一点是你用错了关系,应该是User::class中的hasMany('App\Financial')。说到命名约定,transaction() 可能不如user(),但这是你自己的选择。
  • 虽然有可能,但是将应用程序逻辑添加到视图中是个坏主意。如果您要更改视图(模板、布局等),您还必须了解应用程序代码,这可能很麻烦。尝试将您的应用程序拆分为逻辑(控制器和服务)和表示(视图)。

标签: php laravel laravel-5 eloquent laravel-blade


【解决方案1】:

通过使用Laravel Collection Method PluckLaravel Blade Service Injection 解决。下面是我为归档我想要的内容所做的代码:

@inject('financial','App\Financial') {{-- inject before foreach --}}
@foreach ($user as $u)
    <tr>
        <td>{{$u->id}}</td>
        <td>{{$financial->where('user_id','=',$u->id)->get()->pluck('profit')->sum()}}</td>
    </tr>
@endforeach

评估发生了什么:

$financial->where('user_id','=',$u->id)->pluck('profit')->sum()
//   get financial where user_id = $u->id   // get the profit // sum the profit 

干杯!

【讨论】:

    【解决方案2】:

    您可以简单地这样做:

    {{$u->financial()->sum('gross')}}
    

    如果您正在对关系运行查询,请在调用时添加函数括号。

    【讨论】:

    • 我也希望在控制器中加载关系,使用with('financial') 和闭包,如User::with('financial', function($q) { $q-&gt;sum('gross'); })-&gt;get();。这样做时,上面的代码减少到{{ $u-&gt;financial }}。因为您正在访问一个已经加载的关系,所以不再需要函数调用。
    猜你喜欢
    • 1970-01-01
    • 2020-11-08
    • 2019-06-27
    • 2019-02-09
    • 2014-01-18
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多