为什么这种多态的多对多关系返回空? Laravel 5.3

时间:2016-12-12 05:51:32

标签: php laravel-5 many-to-many polymorphic-associations

我的用户表和他们的一些数据之间建立了多对多的关系。目前它已经空了,我不知道为什么。 这种关系看起来有点像这样:

polymorphic

由于用户具有完全相同的设置,我现在正在测试代理商代码。

我正在尝试在语言表中为该机构标记的每种语言调用该语言的描述。像这样:

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表中,如下所示:

languageables table info

它将不显示任何内容,当我尝试使用关系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'

1 个答案:

答案 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。如果将一组名称存储在数据透视表中并尝试将其用作比较,则它将返回空。