我的用户表和他们的一些数据之间建立了多对多的关系。目前它已经空了,我不知道为什么。 这种关系看起来有点像这样:
由于用户具有完全相同的设置,我现在正在测试代理商代码。
我正在尝试在语言表中为该机构标记的每种语言调用该语言的描述。像这样:
public function compose(View $view) {
$loggedinagency = Auth::user()->id;
$agency = Agency::with('languages')->findOrFail($loggedinagency);
$view->with(compact('agency', 'loggedinagency'));
}
In the view blade:
<p> @foreach($agency->languages as $Lang)
{{ $Lang->description }}<br>
@endforeach</p>
语言模型:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Languageable extends Model
{
protected $table = 'languageables';
protected $fillable = ['language_id','languageable_id', 'languageable_type'];
}
语言模型:
<?php
namespace App;
use App\Agency;
use Illuminate\Database\Eloquent\Model;
class Language extends Model
{
protected $table = 'languages';
public function agencyies() {
return $this->morphedByMany('Agency', 'Languageable');
}
}
代理商模式:
<?php
namespace App;
use Illuminate\Notifications\Notifiable;
use App\languageable;
use App\Language;
use Illuminate\Foundation\Auth\User as Authenticatable;
class Agency extends Authenticatable
public function languages() {
return $this->morphToMany(Language::class, 'Languageable');
}
}
架构:
languageables:
Schema::create('languageables', function (Blueprint $table){
$table->increments('id');
$table->integer('language_id');
$table->foreign('language_id')->references('id')->on('languages');
$table->integer('languageable_id');
$table->string('languageable_type', 31);
$table->timestamps();
});
语言:
Schema::create('languages', function (Blueprint $table){
$table->increments('id');
$table->string('subcategory', 31);
$table->string('description', 127);
});
信息存储在languageables表中,如下所示:
它将不显示任何内容,当我尝试使用关系var_dump模型调用时,使用tinker查询将返回null。有什么我错过或错了吗?没有错误,所以在理论上它应该工作,但也许laravel正在寻找数据库中错误的id或数据点?
编辑:调试栏显示正在执行的以下查询:
select `languages`.*, `Languageables`.`Languageable_id` as `pivot_Languageable_id`, `Languageables`.`language_id` as `pivot_language_id` from `languages` inner join `Languageables` on `languages`.`id` = `Languageables`.`language_id` where `Languageables`.`Languageable_id` in ('196') and `Languageables`.`Languageable_type` = 'App\Agency'
答案 0 :(得分:0)
确定。所以我解决了这个问题。对于那些对SQL和数据库更有经验的人来说,问题会立即显现出来,但我需要一段时间才能发现它。
线索是我的调试器抛出的SQL查询,我绝对建议:Laravel Debugbar。
select `languages`.*, `Languageables`.`Languageable_id` as `pivot_Languageable_id`, `Languageables`.`language_id` as `pivot_language_id` from `languages` inner join `Languageables` on `languages`.`id` = `Languageables`.`language_id` where `Languageables`.`Languageable_id` in ('196') and `Languageables`.`Languageable_type` = 'App\Agency'
如果你仔细阅读,你会发现它是一个非常标准的数据透视查询,但最后在那里注意它是如何说'App \ Agency'的?是啊。这就是它正在寻找的东西。它正在检查'App \ Agency'的Languageable_type。
熟悉laravel的人会知道这是命名空间名称。模型的正常参考以及我如何存储它只是代理商。这可能是laravel如何进行多态的错误。
所以现在问题很明显了。我已将模型存储为代理,查询正在寻找App \ Agency。它什么都没找到,并返回null。
我的解决方案是更改数据写入数据库的方式,并将数据重新导入到表中以包含命名空间。我不知道如何在后端解决这个问题。
我的研究偶然发现this可能对你们有些人有所帮助。
对于那里的新手。没有错误的null返回通常意味着正确的SQL查询,但它正在寻找错误的东西。在关系设置中很难弄清楚,所以最好的办法是检查laravel生成的SQL查询正在寻找什么。例如,在数据透视表中,laravel将查找的唯一类型的信息是小写的id。如果将一组名称存储在数据透视表中并尝试将其用作比较,则它将返回空。