相同模型的范围和关系

时间:2015-04-28 12:37:23

标签: php laravel laravel-5

我有一个名为payments的表,其中包含一个名为Vendor ZIP的字段。

我有一张名为201502_postcodes的桌子和我的"加入"在这种情况下,是此表中的postcode字段。

如何使用Eloquent在此201502_postcodes表中返回字段值?

我的模特是;

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Payment extends Model {

public function postcodeExtract()
{
    return $this->belongsTo('App\Models\PostcodeExtract', 'postcode', 'Vendor ZIP');
}

_

<?php namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class PostcodeExtract extends Model {

protected $connection = 'postcodes';

public function scopeFromTable($query, $tableName) 
{
    return $query->from($tableName);
}

public function payment()
{
    return $this->hasMany('App\Models\Payment', 'Vendor ZIP', 'postcode');
}

所以,我在这个模型上有一个scope,因为我的表名的201502部分是一个变量(其中,每个季度都有一个新变量)。

在我的控制器中...我不知道该放什么。我不知道如何让范围和关系发挥作用。如何编写一个将采用邮政编码/邮编并输出其中一个字段的查询(我将它们称为&#34;方法&#34;?)邮政编码提取表?

这不是这个问题Laravel 4: Dynamic table names using setTable()的重复,因为在这个问题上不涉及或讨论关系。

---更新---

如果我要使用getTable - 它会是这样的......

class PostcodeExtract {

  public function setTableByDate($selected_tablename)
  {
    $this->table = $selected_tablename;

    // Return $this for method chaining
    return $this;
  }

  public function getTable()
  {
    if (isset($this->table))
        $this->setTableByDate($this->table);

    return $this->table;
  }
}

然后我会在我的控制器中使用它;

$selected_tablename = 201502_postcode //created by some other controller
$postcode_extract = new PostcodeExtract;
$data = $postcode_extract->setTableByDate($selected_tablename)->get()->toArray();

Carbon这些东西并不是真的相关。我有一个查找,以获取这些表名,事实上,带有日期值的前缀不应该意味着它被视为日期。

1 个答案:

答案 0 :(得分:1)

这里有几件事情。

scopeFromTable()是多余的

Laravel使用魔术方法来处理对未定义方法的调用。在模型上调用from()实际上会从模型内部Query对象上调用()(假设你没有定义一个名为&#39;来自模型本身的方法 )。值得一读Model类的__call and __callStatic方法。

关系使用getTable()

Laravel的另一个方面是约定优于配置的概念。这基本上意味着框架假定了一些事情,因此您不必定义每个细节。关于表命名约定,它自然会使用从类名派生的表名。

// Uses table 'foos'
class Foo {}

有几种方法可以改变这种行为。首先,您可以定义表格&#39;像这样的数据成员。

class Foo {
    protected $table = 'bars';
}

如果您需要更动态的行为,则可以重新定义getTable方法。

class Foo {
    public function getTable()
    {
        // return your special table name based on today's date
    }
}

最终,模型及其关系引用getTable来确定表名应该是什么。

您的用例

如果您只需要查询当前表,那么我建议您重新定义getTable。

如果您需要同时查询当前过去的表,那么我建议在重新定义getTable的同时配对新方法

class Foo {
    public function setTableByDate(\DateTime $date)
    {
        $this->table = // generate table name from $date

        // Return $this for method chaining
        return $this;
    }

    public function getTable()
    {
        if (isset($this->table))
            $this->setTableByDate(\Carbon\Carbon::now());

        return $this->table;
    }
}

有了这个,您不必担心控制器或其他任何地方的表名,除非您需要查询过去的记录。

按用户设置日期

$ foos = Foo :: setTableByDate($ user-&gt; some_date) - &gt; where(...) - &gt; get();