Я пытаюсь понять, как работает Eloquent и какие преимущества перед использованием простых запросов sql (объедините таблицы A и B в columA.id = columnB.id ...)
У меня есть две модели: каналы и подкатегории в отношении "многие ко многим".
Я создал сводную таблицу channel_subcategory и добавил такое отношение:
public function up()
{
Schema::create('channel_subcategory', function (Blueprint $table) {
$table->increments('id');
$table->timestamp('created_at')->useCurrent();
$table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
$table->integer('channel_id')->unsigned()->nullable();
$table->foreign('channel_id')->references('id')->on('channels')->onDelete('cascade');
$table->integer('subcategory_id')->unsigned()->nullable();
$table->foreign('subcategory_id')->references('id')->on('subcategories') ->onDelete('cascade');
});
}
I want to get one channel given the slug property and the subcategories it belongs to. So I did this in the ChannelController.php
public function show($slug)
{
$channel = Channel::where('channels.slug', '=', $slug)->first();
foreach ($channel as $subcategory) {
echo $subcategory->title;
}
}
I get the error:
ErrorException in ChannelController.php line 107: Trying to get property of non-object
All I want is to show the channel name and the categories it belongs to.
Я прочитал много блогов, в том числе документацию Laravel, и они всегда объясняют миграции, как установить связь в модели (принадлежит многим) и даже как сохранить связанные данные. Но нигде я не нашел ни единого описания (для чайников), которое говорит, что теперь давайте возьмем некоторые данные из двух таблиц, например:
- get all the categories one channel belongs to.
- get all the channels in one category
- получить все каналы, принадлежащие более чем к одной категории
- получить категорию с большим количеством каналов.
Другими словами, простое объяснение того, как это сделать.
ИЗМЕНИТЬ Добавление модели моего канала
public function subcategory()
{
return $this->belongsToMany('App\Subcategory')->withTimestamps();
}