2016-12-12 10 views
-1

多様な関係が私のユーザーテーブルとそのデータの間に設定されています。現時点ではそれは空に戻っています、なぜ私は分かりません。ユーザーがまったく同じセットアップを持っている、と私は現時点で代理コードをテストしていますので多対多の多対多リレーションシップが空になるのはなぜですか? Laravel 5.3

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> 

Languageableモデル:

<?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(); 
     }); 

言語:情報がそうのようなlanguageablesテーブルに格納されて

Schema::create('languages', function (Blueprint $table){ 

       $table->increments('id'); 
       $table->string('subcategory', 31); 
       $table->string('description', 127); 
      }); 

languageables table info

それは何も表示されません、といじくりに問い合わせます関係を持つモデル呼び出しをvar_dumpしようとするとnullを返します。私が逃した、または間違った何かがありますか?理論上はエラーがないので、うまくいくはずですが、おそらくlaravelはデータベース内の間違ったIDやデータポイントを探していますか?

編集: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' 

答えて

0

[OK]をクリックします。だから私は問題を解決しました。この問題は、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' 

あなたがそれを読んでいる場合、あなたはそれはかなり標準ピボットクエリですが、そこに終わり、それはアプリケーション\庁は「言うか気づくわかりますか?うん。それはそれが探しているものです。 Languageable_typeで 'App \ Agency'をチェックしています。

laravelをよく知っている人は、名前空間の名前を知っています。モデルの標準的な参照と私がそれをどのように保存したかは単なるAgencyです。これは、laravelが多態性をどのようにしているかのバグかもしれません。

だから、今問題は明らかです。私はエージェンシーとしてモデルを保存しており、クエリはApp \ Agencyを探しています。何も見つからず、nullを返します。

私のソリューションは、データがデータベースに書き込まれる方法を変更し、名前空間を含むようにデータをテーブルに再度インポートすることでした。私はどのようにバックエンドでこれを修正するか分かりません。

私の研究はあなたの助けになるthisにつまずいた。

初心者向けです。エラーのないnull戻り値は、通常、正しいSQLクエリを意味しますが、間違ったものを探しています。リレーショナル設定ではこれを理解するのは難しいかもしれませんので、laravelが生成したSQLクエリが探しているものを常に確認するのが一番の方法です。たとえば、ピボットテーブルでは、laravelが探す情報の唯一のタイプは小文字のIDです。ピボットテーブルに名前のセットを格納し、それを比較として使用しようとすると、空に戻ります。

関連する問題