Почему запрос Laravel Combine не работает? - PullRequest
0 голосов
/ 31 января 2019

Модель моих каналов:

  class Channels extends Model
    {

      protected $fillable = ['title','slug'];

      public function Discussion()
      {
          return $this->hasMany('App\Discussion');
      }

    }

Модель канала:

 class Channels extends Model
    {
        protected $fillable = ['title','slug'];

        public function Discussion()
        {
            return $this->hasMany('App\Discussion');
        }

    }

Файл миграции канала:

class CreateChannelsTable extends Migration
{

    public function up()
    {
        Schema::create('channels', function (Blueprint $table) {
          $table->increments('id');
          $table->string('title');
          $table->string('slug');
          $table->timestamps();
        });
    }


    public function down()
    {
      Schema::dropIfExists('channels');
    }

}

Файл Discusion Migraion

class CreateDiscussionsTable extends Migration
{

    public function up()
    {
        Schema::create('discussions', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            $table->integer('channel_id')->unsigned();
            $table->string('title');
            $table->text('content');
            $table->text('slug');
            $table->timestamps();
        });
    }


    public function down()
    {
        Schema::dropIfExists('discussions');
    }

}

** Контроллер: **

class HomeController extends Controller
{

    public function __construct()
    {
        $this->middleware('auth');
    }


    public function channel($slug)
    {
        $channel= Channels::where('slug',$slug)->first();
        return view('channel')->with('discussion',$channel->Discussions);
    }

}

и Finnalyмаршрут

Route::get('channel/{slug}',[
'uses' => 'HomeController@channel',
'as' => 'channel']);

** Сейчас я пытаюсь получить данные: **

$channel->Discussions

, но это дает мне ошибку

SQLSTATE [42S22]: Столбец не найден: 1054 Неизвестный столбец 'arguments.channels_id' в 'предложении where' (SQL: выберите * из discussions, где discussions. channels_id = 1 и discussions. channels_id не равно нулю)

Я не знаю, что именно делать сейчас.Пожалуйста, помогите мне

1 Ответ

0 голосов
/ 31 января 2019

Прежде всего, очень важно правильно назвать ваши классы и их отношения.

Laravel делает некоторые предположения о ваших внешних ключах на основе имен ваших классов и определений отношений.Вы также можете указать внешние ключи, если хотите.

Впрочем, вот как я это сделал.

class Channel extends Model
{
    protected $fillable = ['title','slug'];

    public function discussions()
    {
        return $this->hasMany('App\Discussion');
    }
}

Обратите внимание, что здесь название модели называется Channel.Когда у нас есть это имя класса и отношения, Laravel будет предполагать, что у модели обсуждения есть внешний ключ с именем channel_id, который он делает.

Вам также необходимо определить обратную связь в вашей модели обсуждения.

class Discussion extends Model
{
    public function channel()
    {
        return $this->belongsTo('App\Channel');
    }
}

Теперь сработает следующее:

public function channel($slug)
{
    $channel = Channel::whereSlug($slug)->first();

    return view('channel')->with('discussion', $channel->discussions);
}

Если вы связаны и не можетеизмените название модели по любой причине, тогда вам нужно указать внешний ключ в ваших определениях отношений.Например:

public function discussions()
{
    return $this->hasMany('App\Discussion', 'channel_id');
}

public function channel()
{
    // This one can stay the same as Laravel will try to match `channel_id` 
    // on the discussion table to the id on the channels table
    return $this->belongsTo('App\Channel');
}

Для получения дополнительной информации читайте о Красноречивых связях .

Извините, я уже писал об этом, когда @Julien Metral прокомментировал, но этопродолжение того, что он уже сказал:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...