У меня полиморфные отношения между многими, установленными между моими пользовательскими таблицами и некоторыми их данными. Сейчас он возвращается пустым, и я не знаю почему.
Отношения выглядят примерно так:
Так как у пользователей точно такая же настройка, и я сейчас проверяю код агентства.
Я пытаюсь вызвать описание языка в таблице языков для каждого языка, который помечено агентством. Что-то вроде этого:
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 следующим образом:
Он ничего не покажет, а запрос с помощью tinker вернет ноль, когда я попытаюсь var_dump вызвать модель со связью. Есть что-то, что я пропустил или ошибся? Там нет ошибки, так что в теории это должно работать, но, возможно, Laravel ищет неправильный идентификатор или точку данных в базе данных?
Редактировать: панель отладки показывает следующий выполняемый запрос:
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»? Да уж. Это то, что он ищет. Это проверяет в Languageable_type для «App \ Agency».
Те из вас, кто знаком с Laravel, знают, что это имя в пространстве имен. Обычная ссылка на модель и то, как я ее хранил, это просто агентство. Это может быть ошибкой в том, как Laravel делает полиморфные.
Так что проблема теперь ясна. Я сохранил модель как агентство, и запрос ищет приложение \ агентство. Он ничего не находит и возвращает ноль.
Моим решением было изменить способ записи данных в базу данных и повторно импортировать данные в таблицу, чтобы включить пространства имен. Я понятия не имею, как это исправить в бэкэнде.
Мои исследования наткнулись на этот что может помочь некоторым из вас.
Для новичков там. Нулевое возвращение без ошибки обычно означает правильный запрос SQL, но он ищет неправильную вещь. Это может быть трудно понять в реляционных установках, поэтому лучше всего всегда проверять, что ищет SQL-запрос, сгенерированный laravel. Например, в сводных таблицах единственным типом информации, который будет искать laravel, является идентификатор в нижнем регистре. Если вы сохраните набор имен в сводной таблице и попытаетесь использовать это в качестве сравнения, он вернется пустым.
Других решений пока нет …