Laravel 多关系代理属性的雄辩变形

Laravel 多关系代理属性的雄辩变形,laravel,eloquent,laravel-5,Laravel,Eloquent,Laravel 5,在我的申请中,我做了一个奇怪的观察,一个看似相等的操作与另一个操作有不同的结果 我有以下表格: 别名: $table->engine = "InnoDB"; $table->increments("id"); $table->morphs("aliasable"); $table->string("alias"); $table->string("locale"); $table->engine = "InnoDB"; $table->incremen

在我的申请中,我做了一个奇怪的观察,一个看似相等的操作与另一个操作有不同的结果

我有以下表格:

别名:

$table->engine = "InnoDB";
$table->increments("id");
$table->morphs("aliasable");
$table->string("alias");
$table->string("locale");
$table->engine = "InnoDB";
$table->increments('id');
类别:

$table->engine = "InnoDB";
$table->increments("id");
$table->morphs("aliasable");
$table->string("alias");
$table->string("locale");
$table->engine = "InnoDB";
$table->increments('id');
类别
模型与
别名
模型有关系:

public function aliases()
{
    return $this->morphMany("Alias", "aliasable");
}
尝试操作类别别名的数据时,以下两种方法之间存在差异:

$category = Category::find(1);
$alias = $category->aliases()->first();
$alias->alias = "test";
$alias->save();

$category = Category::find(1);
$alias = $category->aliases()->first()->alias = "test";
$category->aliases()->first()->save();
第一个正在工作,第二个没有保存更改。 我希望第二个版本能够正常工作,因为我试图在我的类别模型上实现代理属性,以便像这样更改别名:

$category = Category::find(1);
$category->germanAlias = "Heidi";
$category->push();
你知道为什么我的方法没有达到预期效果吗

$category->aliases()->first()->save();
此行选择第一个别名并保存它。实际上什么都没做。你的第一种方法是正确的。你也可以这样做

$category->aliases()->first()->update(['alias' => 'test']);
如果您的别名字段包含在
别名
模型的
$filleble
属性中

编辑

运行下面的代码并比较对象ID

$alias = $category->aliases()->first()->alias = "test";
var_dump(alias);
dd($category->aliases()->first());

这里要理解的关键是关系在模型上的缓存方式。直接访问关系方法时,不会发生缓存。您基本上是基于该关系定义实例化一个新查询

$query = $category->aliases();
$alias = $query->first();
如果像访问模型的成员/属性一样访问关系,那么它将作为模型上的集合加载和缓存关系

$collection = $category->aliases;
$alias = $collection->first();
以后通过此方法访问相关模型的尝试将引用相同的缓存模型集合。这应该行得通

$category->aliases->first()->alias = 'test';
$category->aliases->first()->save();

/illumb/Database/elount/Model中有一个神奇的方法,它将对未定义成员的请求重定向到该方法。代码注释在解释其余部分方面做得相当好,但基本上它检查、加载、缓存和重用关系。

但为什么引用的行不保存更改?我假设它再次获取模型,放弃任何更改。是吗?您每次都在创建获取模型的新实例。感谢您澄清了缓存的相关逻辑。现在的问题是,我仍然希望我的“代理属性”能够正常工作。我指的是一个虚拟属性,它以某种方式将所有更改映射到具有特定区域设置的相关别名模型<代码>$category->thisMapsToGermanAlias=“Deutsch”
echo$category->thisMapsToGermanAlias你会怎么做?你正在寻找变异子。请看我上面链接的getAttribute()方法中的第一个注释块。您将看到它检查“get mutator”。长话短说->germanAlias将由->getGermanAliasAttribute()计算,如果您在模型上定义了该属性。这里有一个链接到Laravels关于这个主题的文档。我以前读过所有这些,但是我没有让它工作,所以我必须以与普通属性相同的方式保存此属性。要么我直接将其保存在Mutator中,要么缓存重复出现的问题。。。