我有一个名为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
这些东西并不是真的相关。我有一个查找,以获取这些表名,事实上,带有日期值的前缀不应该意味着它被视为日期。
答案 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();