【问题标题】:One-To-Many Eloquent relation isn't working with irregular words一对多 Eloquent 关系不适用于不规则词
【发布时间】:2018-04-12 04:52:50
【问题描述】:

我有类别->子类别一对多关系(一个类别可以有许多子类别)但我无法让它工作,我基本上已经尝试了所有方法,但不知道下一步该做什么。

我的迁移和种子:

Categories:


Schema::create('categories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->text('description');
            $table->string('image_url');
            $table->timestamps();
        });


---------

DB::table('categories')->insert([[
            'id' => 1,
            'name' => 'Verbs',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => ''
        ],[
            'id' => 2,
            'name' => 'Nouns',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => ''
        ],[
            'id' => 3,
            'name' => 'Idioms',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => ''
        ],[
            'id' => 4,
            'name' => 'Adjectives',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => ''
        ]
        ]);


Subcategories:

Schema::create('subcategories', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->text('description');
            $table->string('image_url');
            $table->integer('category_id')->unsigned()->index;
            $table->timestamps();
        });

---------

DB::table('subcategories')->insert([[
            'id' => 1,
            'name' => 'Sport verbs',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Verbs')->pluck('id')->first()
        ],[
            'id' => 2,
            'name' => 'Cooking verbs',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Verbs')->pluck('id')->first()
        ],[
            'id' => 3,
            'name' => 'Business verbs',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Verbs')->pluck('id')->first()
        ],[
            'id' => 4,
            'name' => 'School verbs',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Verbs')->pluck('id')->first()
        ],[
            'id' => 5,
            'name' => 'Sport nouns',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Nouns')->pluck('id')->first()
        ],[
            'id' => 6,
            'name' => 'Sport idioms',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Idioms')->pluck('id')->first()
        ],[
            'id' => 7,
            'name' => 'Sport adjectives',
            'description' => 'Lorem ipsum dolor sit amet',
            'image_url' => '',
            'category_id' => DB::table('categories')->where('name', 'Adjectives')->pluck('id')->first()
        ],
        ]);

型号:

类别:

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Subcategory;

class Category extends Model
{
    protected $table = 'categories';
    protected $fillable = ['name', 'description', 'image_url', 'id'];

    public function subcategories()
    {
        return $this->hasMany(Subcategory::class, 'category_id');
    }
}

子类别:

namespace App;

use Illuminate\Database\Eloquent\Model;
use App\Category;

class Subcategory extends Model
{
    protected $table = 'subcategories';
    protected $fillable = ['name', 'description', 'image_url', 'category_id', 'id'];

    public function category()
    {
        return $this->belongsTo(Category::class, 'category_id');
    }
}

在控制器中:

class CategoriesController extends Controller
{
    public function index($id)
    {
        $subcategories = Category::findOrFail($id)->subcategories();
        foreach ($subcategories as $subcategory)
            echo $subcategory->name . '<br>';
    }
}

路线:

Route::get('/category/{id}', 'CategoriesController@index');

所以它在网址上website.test/category/1

但它什么也没给我。如果我只是打印类别的名称(所以只使用没有其子类别关系的类别)它可以工作。只是关系没有。我真的不知道我能做什么。你有什么想法吗?

问候:)

【问题讨论】:

  • 将子类别称为道具,而不是函数:$subcategories = Category::findOrFail($id)-&gt;subcategories;。函数返回查询,prop返回查询结果
  • @devk 正确,但您也可以在-&gt;subcategories() 之后添加-&gt;get() 以返回Collection。这是对数据库的额外调用(-&gt;subcategories 可能是也可能不是,取决于 -&gt;with() 的使用情况)。

标签: php laravel laravel-5 eloquent laravel-5.6


【解决方案1】:

得到答案,要更改的内容在控制器中:

$subcategories = Category::with('subcategories')->findOrFail($id);

然后循环:

echo "<div>Category: {{$category->name}}</div>";
echo "<div>Subcategories:</div>";
foreach ($category->subcategories as $subcategory)
            echo $subcategory->name . '<br>';

【讨论】:

    猜你喜欢
    • 2022-12-31
    • 1970-01-01
    • 2018-02-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-29
    • 2013-09-25
    • 1970-01-01
    相关资源
    最近更新 更多