簡體   English   中英

為什么這個多態多對多關系返回空? Laravel 5.3

[英]Why is this polymorphic many to many relationship returning empty? Laravel 5.3

我在用戶表及其某些數據之間建立了多態的多對多關系。 目前它返回的是空的,我不知道為什么。 關系看起來像這樣:

多態的

由於用戶的設置完全相同,因此我目前正在測試代理商代碼。

我正在嘗試在語言表中為代理商標記的每種語言調用該語言的描述。 像這樣:

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'

好。 所以我解決了這個問題。 對於那些對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。 它什么也找不到,並返回null。

我的解決方案是更改將數據寫入數據庫的方式,然后將數據重新導入到表中以包括名稱空間。 我不知道如何在后端解決此問題。

我的研究偶然發現了這一點 ,可能對您有些幫助。

對於在那里的新手。 沒有錯誤的空返回值通常表示正確的SQL查詢,但它查找的是錯誤的內容。 在關系設置中可能很難弄清楚,因此最好的選擇是始終檢查laravel生成的SQL查詢正在尋找什么。 例如,在數據透視表中,laravel唯一要查找的信息類型是小寫的id。 如果將一組名稱存儲在數據透視表中並嘗試將其用作比較,則它將返回空。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM