Laravel Custom Eloquent Method

时间:2016-09-08 10:44:38

标签: php laravel eloquent

我一直在构建查询并重复代码,有没有办法将其构建到雄辩的模型中?

我有一个模型Transaction,我在这里选择特定货币。如何将其添加到模型中?有没有办法改变这个:

Transaction::select('*')->where('currency', '=', 'GBP')

所以我可以这样做:

Transaction::select('*')->currency('GBP')

然后在模型中,它以某种方式添加到查询中。我试图创建Transaction::currency但它没有用。这只是一个例子,我计划添加一些选择器来保持代码清洁。

class Transaction extends Model
{
    protected $table = 'transactions';


    public function currency($query, $currency) {
      return $query->where('currency', '=', $currency);
    }
}

3 个答案:

答案 0 :(得分:1)

你差不多完成了,你必须把货币方法写成查询范围。

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">


    <android.inputmethodservice.KeyboardView
        android:id="@+id/keyboard"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:textDirection="rtl"
        android:keyPreviewLayout ="@layout/preview"></android.inputmethodservice.KeyboardView>

 <android.support.v4.view.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
     />


</FrameLayout>

完成后,你可以使用这样的范围

public function scopeCurrency($query, $currency) {
  return $query->where('currency', '=', $currency);
}

有关详细信息,请转到此处https://laravel.com/docs/5.2/eloquent#local-scopes

答案 1 :(得分:1)

Laravel有这样的东西叫做查询范围。它允许您完全按照自己的意愿行事。您只需要在currency()方法前加上范围关键字,如下所示:

class Transaction extends Model
{
    protected $table = 'transactions';


    public function scopeCurrency($query, $currency) {
      return $query->where('currency', '=', $currency);
    }
}

然后你可以执行此操作Transaction::select('*')->currency('GBP')

详细了解范围here

答案 2 :(得分:0)

您可以使用范围来完成此操作。

将这些代码添加到Transaction.php文件

public function scopeCustom($query, $column, $exp, $value)
{
    return $query->where('votes', $exp, $value);  // ('currency', '=', 'GBP')
}

现在将此范围用作

Transaction::select('*')->custom('currency', '=', 'GBP');
Transaction::select('*')->custom('amount', '>', 1000);