情况:在我的工作中,他们对数据库,表和列名称有约定,这些约定有点长且重复。习惯于Eloquent我认为重新实现__get
和__set
方法并不会制造大量的getter会有很多麻烦。这样的事情(toConvention
实现了公司的惯例):
use Illuminate\Database\Eloquent\Model;
class CompanyModel extends Model {
public function __get($key){
return $this->getAttribute($this->toConvention($key));
}
public function __set($key){
return $this->setAttribute($this->toConvention($key));
}
}
适用于检索属性,但不适用于检索关系。以下是实施:
use App\CompanyModel as Model
class Location extends Model
{
protected $table = 'tablename';
protected $primaryKey = 'primarykeycolumn';
//...
public function comissionCurrency(){
return $this->belongsTo('App\Currency', 'foreign', 'other');
}
}
use App\CompanyModel as Model
class Currency extends Model
{
protected $table = 'tablename';
protected $primaryKey = 'primarykeycolumn';
//...
}
在请求属性时,如$location->name
或$location->comission_currency_id
一切都按预期工作,检索相应的列名称。但是当我尝试检索belongsTo
关系时,在使用toSql()
后,我看到几乎形成了正确的查询:select * from table where table.column is null
is null
部分应该与相应的ID进行比较。
我知道这是由于我的实施,因为当我use Illuminate\Database\Eloquent\Model
一切正常时。有趣的是,当我在儿童模型上使用Eloquent的模型并在另一个模型上重新实现时,它起作用(但是我不能在子模型中使用我的魔法方法,在父模型中我可以从这种关系中获取...)
我还没有弄清楚通过阅读Eloquent的代码,任何想法或建议来重新实现哪种方法来完成这项工作? 提前谢谢。