【问题标题】:Why is this polymorphic many to many relationship returning empty? Laravel 5.3为什么这种多态的多对多关系返回空?拉拉维尔 5.3
【发布时间】:2016-12-12 05:51:32
【问题描述】:

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

由于用户的设置完全相同,我目前正在测试代理代码。

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

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

它不会显示任何内容,当我尝试 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'

【问题讨论】:

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


    【解决方案1】:

    好的。所以我已经解决了这个问题。对于那些对 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,这可能对你们中的一些人有所帮助。

    对于那里的新手。没有错误的空返回通常意味着正确的 SQL 查询,但它正在寻找错误的东西。这在关系设置中很难弄清楚,所以最好的办法是检查 laravel 生成的 SQL 查询正在寻找什么。例如,在数据透视表中,laravel 将查找的唯一信息类型是小写的 id。如果您将一组名称存储在数据透视表中并尝试将其用作比较,它将返回空。

    【讨论】:

      猜你喜欢
      • 2022-10-14
      • 2015-04-13
      • 2017-08-24
      • 2018-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多