为什么这种多态的多对多关系返回空? Laravel 5.3
Why is this polymorphic many to many relationship returning empty? Laravel 5.3
我在我的用户 table 和他们的一些数据之间建立了多态的多对多关系。目前它 returning 是空的,我不知道为什么。
关系看起来有点像这样:
由于用户的设置完全相同,我目前正在测试代理商代码。
我正在尝试为代理商标记的每种语言调用 table 语言中的语言描述。像这样:
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');
}
}
架构:
语言能力:
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 table 中,如下所示:
它不会显示任何内容,并且当我尝试 var_dump 具有关系的模型调用时,使用 tinker 进行查询将 return 为空。有什么我错过或弄错了吗?没有错误,所以理论上它应该可以工作,但也许 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'
好的。所以我已经解决了这个问题。对于那些对 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 的人会知道这是命名空间名称。模型的正常参考以及我如何存储它只是 Agency。这可能是 laravel 如何进行多态的错误。
那么问题就清楚了。我已将模型存储为 Agency,查询正在查找 App\Agency。它什么也没找到,并且 return 为空。
我的解决方案是更改将数据写入数据库的方式,然后将数据重新导入到 table 以包含命名空间。我不知道如何在后端解决这个问题。
我的研究偶然发现了 this,这可能对你们中的一些人有所帮助。
对于那里的新手。没有错误的 null return 通常意味着正确的 SQL 查询,但它正在寻找错误的东西。这在关系设置中很难弄清楚,所以最好的办法是始终检查 laravel 生成的 SQL 查询正在寻找什么。例如,在 pivot tables 中,laravel 将查找的唯一信息类型是小写的 id。如果您将一组名称存储在数据透视表 table 中并尝试将其用作比较,它将 return 为空。
我在我的用户 table 和他们的一些数据之间建立了多态的多对多关系。目前它 returning 是空的,我不知道为什么。 关系看起来有点像这样:
由于用户的设置完全相同,我目前正在测试代理商代码。
我正在尝试为代理商标记的每种语言调用 table 语言中的语言描述。像这样:
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');
}
}
架构:
语言能力:
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 table 中,如下所示:
它不会显示任何内容,并且当我尝试 var_dump 具有关系的模型调用时,使用 tinker 进行查询将 return 为空。有什么我错过或弄错了吗?没有错误,所以理论上它应该可以工作,但也许 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'
好的。所以我已经解决了这个问题。对于那些对 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 的人会知道这是命名空间名称。模型的正常参考以及我如何存储它只是 Agency。这可能是 laravel 如何进行多态的错误。
那么问题就清楚了。我已将模型存储为 Agency,查询正在查找 App\Agency。它什么也没找到,并且 return 为空。
我的解决方案是更改将数据写入数据库的方式,然后将数据重新导入到 table 以包含命名空间。我不知道如何在后端解决这个问题。
我的研究偶然发现了 this,这可能对你们中的一些人有所帮助。
对于那里的新手。没有错误的 null return 通常意味着正确的 SQL 查询,但它正在寻找错误的东西。这在关系设置中很难弄清楚,所以最好的办法是始终检查 laravel 生成的 SQL 查询正在寻找什么。例如,在 pivot tables 中,laravel 将查找的唯一信息类型是小写的 id。如果您将一组名称存储在数据透视表 table 中并尝试将其用作比较,它将 return 为空。